Android:如何使用setOnClickListener / onClick 20个不同的按钮?

时间:2012-11-28 20:52:41

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

在我的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 ****/
}

在第二种情况下,意图不好,我不能在1个开关中使用更多意图吗?

选项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个App崩溃。

选项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 ****/

这种方式根本不起作用,我在这里做错了吗?

请有人帮助我,我现在正在努力奋斗几天!

谢谢!

4 个答案:

答案 0 :(得分:1)

定义一个HashMap,其中key是view.getId()的Integer值,value是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() ) );
}

答案 1 :(得分:0)

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

所以你的活动基本上可以有20个方法,如下面的

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

在你的布局xml中

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

答案 2 :(得分:0)

您可以创建自定义并覆盖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);         

    }   

}

答案 3 :(得分:-1)

使用您的选项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 ****/
}