【问题标题】:Android: How to use setOnClickListener/onClick for 20 different buttons?Android:如何将 setOnClickListener/onClick 用于 20 个不同的按钮?
【发布时间】:2012-11-16 20:10:54
【问题描述】:

在我的 Android 应用程序中有一个包含 20 个按钮的活动。每个按钮都必须转到另一个活动/页面。 我尝试了几种方法,但我不能多次使用意图。

选项 1:

public void onClick(View v) {

switch(v.getId()){

case R.id.ivNB: 
   Intent intent = new Intent(this, NoordBrabant.class);
   this.startActivity(intent);
   break;

case R.id.ivZH1: 
   Intent intent = new Intent(this, ZuidHolland.class);
   this.startActivity(intent);
   break;

/**** End so 20 more ****/
}

在第二种情况下,intent不好,我不能在1 switch中使用更多的intent吗?

选项 2:

ivNB.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent i = new Intent(getApplicationContext(), NoordBrabant.class);
            startActivity(i);
        }

    });
    ivZeeland.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent i = new Intent(getApplicationContext(), Zeeland.class);
            startActivity(i);
        }

    });
/**** End so 20 more ****/

这种方式适用于 maby 10 中的 5 个相同,但有 20 个应用程序崩溃。

选项 3:

public void onClick(View v) {
        if (v == ivGelderland){
            Intent intent = new Intent(this, Gelderland.class);
            this.startActivity(intent);
        }
        else if (v == ivNB) {
            Intent intent = new Intent(this, NoordBrabant.class);
            this.startActivity(intent);
        }
        else if (v == ivLimburg) {
            Intent intent = new Intent(this, Limburg.class);
            this.startActivity(intent);
        }
/**** End so 20 more ****/

这种方式根本行不通,是不是我这里做错了什么??

请有人帮助我,我现在正在苦苦挣扎几天!

谢谢!

【问题讨论】:

  • “我已经尝试了几种方法,但我无法多次使用意图。”为什么不呢?
  • 你为什么不在第一种情况下只声明一次意图并在其他情况下使用同一个对象?在您的代码中,您对多个变量使用相同的名称,这是重复的局部变量错误!
  • @323go 我认为 Imran 只是说您可以声明 Intent intent = null; 然后在 switch 中设置 intent = ...,然后在 switch 之后使用 if (intent != null) startActivity(intent);... ,但并不能解决问题。
  • @323go 您需要更好地理解 switch-case 恕我直言的变量范围。除非使用大括号,否则每个 case 子句中的变量范围对应于整个 switch 语句。看看:stackoverflow.com/questions/3894119/…
  • 交叉检查是否已在清单文件中声明了所有 20 个活动。

标签: android android-intent onclick android-activity onclicklistener


【解决方案1】:

使用android:onClick xml attribute 将按钮点击映射到方法。

所以你的活动中基本上可以有 20 种方法,如下所示

public void buttonXpressed( View view ){
    startActivity(new Intent(this, MyNextActivity.class));
}

在你的布局xml中

<Button .... 
    android:onClick="buttonXpressed"
   ... >
</Button>

【讨论】:

  • 这根本没有必要,在 Java 中设置 onClick 监听器没有任何意义。事实上,我是专门做的。
  • 你需要让你的班级implements OnClickListener
【解决方案2】:

使用您的选项 1(在切换前声明意图):

public void onClick(View v) {
    Intent intent;
switch(v.getId()){

case R.id.ivNB: 
   intent = new Intent(this, NoordBrabant.class);
   this.startActivity(intent);
   break;

case R.id.ivZH1: 
   intent = new Intent(this, ZuidHolland.class);
   this.startActivity(intent);
   break;

/**** End so 20 more ****/
}

【讨论】:

    【解决方案3】:

    定义一个 HashMap,其中键是 view.getId() 的整数值,值是 Activity 的类。

    private static HashMap<Integer,Class> activityMap = new HashMap<Intger,Class>();
    static {
        activityMap.put( R.id.ivNB, NoordBrabant.class );
        activityMap.put( R.id.ivZH1, ZuidHolland.class );
        //...
    }
    
    // use this in the layout xml file for all the buttons onClick attribute
    public void handleBtnClicked( View vw ) {
        startActivity( new Intent( this, activityMap.get( vw.getId() ) );
    }
    

    【讨论】:

    • 最干净的解决方案恕我直言,甚至可能检查 hashmap 是否包含按钮 id,如果不抛出异常。因此,当您忘记在 hashmap 中添加条目时,它会很快清除。
    【解决方案4】:

    您可以创建自定义并覆盖 onClick 事件,然后只需传递目标活动。

    //自定义按钮

    import android.content.Context;
    
    import android.content.Intent;
    
    import android.util.AttributeSet;
    
    import android.view.View;
    
    import android.view.View.OnClickListener;
    
    import android.widget.Button;
    
    
    public class MyBtn extends Button implements OnClickListener {
    
        private Context context;
        private Class _class;
    
        public MyBtn(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
            this.context = context;
        }
    
        private void init() {
            setOnClickListener(this);
        }
    
        public void setActivity(Class _class) {
            this._class = _class;
        }
    
        @Override
        public void onClick(View v) {
            Intent i = new Intent(context, _class);
            this.context.startActivity(i);
        }
    
    }
    

    // 你的布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" android:orientation="vertical" >
    
        <com.example.mixed.MyBtn
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />
    
         <com.example.mixed.MyBtn
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />
    
          <com.example.mixed.MyBtn
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />
    
           <com.example.mixed.MyBtn
            android:id="@+id/button4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />
    
    </LinearLayout>
    

    // 你的主要活动

    import android.app.Activity;
    import android.os.Bundle;
    
    public class MainActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);     
    
             com.example.mixed.MyBtn btn1 = (com.example.mixed.MyBtn)findViewById(R.id.button1);         
             com.example.mixed.MyBtn btn2 = (com.example.mixed.MyBtn)findViewById(R.id.button2);
             com.example.mixed.MyBtn btn3 = (com.example.mixed.MyBtn)findViewById(R.id.button3);
             com.example.mixed.MyBtn btn4 = (com.example.mixed.MyBtn)findViewById(R.id.button4);
    
             btn1.setActivity(MainActivity2.class);
             btn2.setActivity(MainActivity3.class);
             btn3.setActivity(MainActivity4.class);
             btn4.setActivity(MainActivity5.class);         
    
        }   
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多