1

我在 Activity 中有许多按钮,单击它们我需要打开不同的网页,其 URL 存储在 ArrayList 集合中。我想使用一个循环,但我得到一个“不能引用以不同方法定义的内部类中的非最终变量”。

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);

我怎么能循环写这个?

4

1 回答 1

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。

于 2013-07-26T21:13:45.680 回答