我在Activity中有很多按钮并单击它们我需要打开不同的网页,其URL存放在ArrayList集合中。我想使用循环,但我得到一个“不能引用在不同方法中定义的内部类中的非final变量”。
public class MainActivity extends Activity {
public List<String> links = new ArrayList<String>();
public static final int NRBUTTONS = 7;
..........................
@Override
protected void onCreate(Bundle savedInstanceState) {
..........
..........
int id = R.id.button1 - 1;
for (int index=0; index<NRBUTTONS; index++) {
Button b = (Button) findViewById(++id);
String text = titles.get(index);
b.setText(text);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent browserIntent = new Intent (Intent.ACTION_VIEW,
Uri.parse(links.get(index)));
startActivity(browserIntent);
}
});
}
...........
}
另外,如果你能帮助我,请
Button b = (Button) findViewById(R.id.button1);
Button b = (Button) findViewById(R.id.button2);
Button b = (Button) findViewById(R.id.button3);
Button b = (Button) findViewById(R.id.button4);
我怎么能在循环中写这个?
答案 0 :(得分:1)
我只是简单介绍一下我在做这类事情时经常使用的模式:
private static final int[] buttonIds = {R.id.button1, R.id.button2, R.id.button3, R.id.button4 };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.start_layout);
for (int i=0; i<buttonIds.length; i++) {
Button b = (Button) findViewById( buttonIds[i] );
if( b != null ) {
// Assign onClickListener, etc.
} else {
// Log This; shouldn't happen
}
}
....
}
以及通用onClick
:
@Override
public void onClick(View v) {
switch( v.getTag() ) {
case R.id.Button1:
/// Do something for Button1
break;
case R.id.Button2:
/// Do something for Button2
break;
case R.id.Button3:
/// Do something for Button3
break;
case R.id.Button4:
/// Do something for Button4
break;
default:
/// Log this; shouldn't happen
}
}
此外,您还可以快速了解一些令您头疼的问题:如果您按照以下方式声明Activity
课程:
public class MainActivity extends Activity implements OnClickListener {
那么你的onClick()
回调可以只是Activity类的一个方法。然后,这将您的作业简化为:
b.setOnClickListener( this );
我个人更喜欢为各种按钮创建单独的回调,因为它可以保持一切井井有条。其他程序员有不同的偏好,他们没有更好或更差,IMO。