【发布时间】:2011-06-17 04:27:31
【问题描述】:
对话框和数组显示得很好,我只想能够在onClick 中的原始类中设置静态变量,该类位于不同类中的方法中。所有try、catch 和
<?> 是我在编译器的坚持下放入的:
public class Setter
{
public void myList(Context context, Class<?> thisclass, int arrayid, String choice)
{
return new AlertDialog.Builder(context)
.setItems(arrayid, new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
setChoice(thisclass, context, arrayid, which, choice);
}
})
.create();
}
public void setChoice(Class<?> thisclass, Context context, int arrayid, int which, String choice)
{
String[] array = context.getResources().getStringArray(arrayid);
try
{
Field f = thisclass.getDeclaredField(choice);
f.set(null, array[which]);
}
catch (SecurityException e)
{
e.printStackTrace();
}
catch (NoSuchFieldException e)
{
e.printStackTrace();
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
}
public class ClassA extends Activity
{
static String stringa;
Setter setted = new Setter();
...
public void onCreate()
{
super.onCreate();
...
AlertDialog thinga = setted.myList(this, getclass(), R.array.thinga, stringa).show();
...
}
}
当我从列表中选择一个项目时,我会从调试器中得到这个:
ClassCache.findFieldByName(Field[], String) line: 438
Class.getDeclaredField(String) line: 666
Setter.setChoice(Class, Context, int, int, String) line: 45 // the line with the Field
我想我把它传错了,但这有点超出我目前的深度。
我有许多不同的班级,每个班级都有自己的static Strings。我在String (在choice 中)和context 的名称下方传递了我希望的原始类,该类调用了一个调用导致下面代码的方法的方法。我希望我可以打电话给context.choice = something,机器会把它读作ClassA.stringa = something;,我该怎么做?
简而言之,我希望有一个用户可以从中选择的项目列表作为对话的内容,并保存它们的选择并可供调用创建对话的类访问。也许我做错了这一切,但我厌倦了处理涉及使用微调器做同样事情的其他“kludges”。
因为onClick 不能在其他地方声明非最终对象(至少这是我的理解),我想也许我可以通过调用另一个方法来解决这个问题,setChoice 将存储任何值选择。我肯定会说这是一个杂牌,我很想知道你应该如何处理这些事情。
【问题讨论】:
-
对我来说,您的代码有一种奇怪的味道,并且看起来可能是一个混搭。为什么不使用 OOP 技术,创建一个接口并利用多态性的力量调用适当的接口方法呢?另外,为什么是 static 变量?
-
@Hovercraft,事实上他在被调用的方法中设置了调用者的变量,这比气味更糟糕。
stringa=polka;代替setted.setChoice(this, stringa, polka);就足够了。不知何故,他试图抽象出一个赋值语句。 -
@Hovercraft,我在这里见过的最好的名字。您可能是完全正确的,我希望有人将其作为答案之一,如果不是生病的话,必须阅读界面。 @Vineet,我说这是一个极端的简化。我已经用我一般要做什么以及我试图使用这个特定代码做什么来更新问题的底部。
标签: java class methods static closures