如何在100个按钮中处理onClick()?

时间:2013-08-05 10:49:52

标签: java android refactoring

我在布局中有100个按钮,所有这些按钮都有OnClick()方法。

如果我使用switch,我需要为所有100个按钮执行case R.id.button1, ..., case R.id.button100。如何缩短此代码?

public void webClick(View v) 
{
    switch(v.getId())
    {
    case R.id.button1:
        Intent intent = new Intent(this, Webview.class);
        intent.putExtra("weblink","file:///android_asset/chapter/chapter1.html");
        startActivity(intent);
        break;

    case R.id.button2:
        Intent intent2 = new Intent(this, Webview.class);
        intent2.putExtra("weblink","file:///android_asset/chapter/chapter2.html");
        startActivity(intent2);
        break;

    // ...

    case R.id.button100:
        Intent intent100 = new Intent(this, Webview.class);
        intent100.putExtra("weblink","file:///android_asset/chapter/chapter100.html");
        startActivity(intent100);
        break;
    }
 }

6 个答案:

答案 0 :(得分:5)

如果网址直接取决于ID,请尝试以下操作:

public void webClick(View v) 
{
    Intent intent = new Intent(this, Webview.class);
    intent.putExtra("weblink","file:///android_asset/chapter/chapter" + v.getId() + ".html");
    startActivity(intent);
}

EDITED

如果您的URL不直接依赖于ID,请尝试使用URLS映射按钮ID,如下所示:

Map<Integer, String> urls = new HashMap();

urls.put(R.id.button1, "file:///android_asset/chapter/chapter100.html");
// ... 1 to 100 ...

并修改上面的代码:

public void webClick(View v) 
{
    Intent intent = new Intent(this, Webview.class);
    intent.putExtra("weblink", urls.get(v.getId()));
    startActivity(intent);
}

编辑#2

如果在你的按钮的标签中你已经有了URL,那么sugestion(不是我的,但由@pad制作)将用它来这样计算URL:

public void webClick(View v) 
{
    Intent intent = new Intent(this, Webview.class);
    intent.putExtra("weblink", "file:///android_asset/chapter/chapter" + v.getText().replaceAll("Chapter ","") + ".html"); // Assuming your text is like "Chapter 50"
    startActivity(intent);
}

答案 1 :(得分:2)

对于您的案例中的更多按钮,在循环中动态创建按钮并分配onclick事件,例如..

在xml文件中创建一个LinearLayout

现在将所有按钮添加到LinearLayout中,如..

String[] urls={url1,url2.....url100}; //  here write your all URLs
Button button[]= new Button[100];
LinearLayout mainlinear=(LinearLayout) findViewById(R.id.main_layer);
for (int i = 0; i < 100; i++) {
            button[i] = new Button(this);
            button[i].setText(i);
            button[i].setTag(i+":"+URL); // URL = What you need to pass when button is click
            button[i].setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {

                                    TextView selected = (TextView) v;
                                    String tag = selected.getTag().toString();

            //Here you need to write your code when button is pressed.

Intent intent = new Intent(this, Webview.class);
        intent2.putExtra("weblink",urls[i]);
        startActivity(intent2);
            }

            }
    mainlinear.addView(button[i]);

答案 2 :(得分:0)

我认为这应该有效:

public void webClick(View v) 
            {
                  String stringID = String.valueOf(v.getId());
                  String[] temp = stringID.split("utton");
                  stringID = "file:///android_asset/chapter/chapter" +temp[1]+ ".html"
                  Intent intent = new Intent(this, Webview.class);
                  intent.putExtra("weblink",stringID);
                  startActivity(intent);
            }

答案 3 :(得分:0)

您可能想要使用ListView。如果你想拥有按钮,那么使用ListView,每个项目的布局都有一个按钮。

然后,您设置了onItemClickListener。您获得该按钮的位置(第一个位置为0,第二个位置为1,等等)。然后撰写一个链接:

String link= "file:///android_asset/chapter/chapter" + (position +1) + ".html";

代码的其余部分将是相同的(intent.putExtra("weblink", link);

答案 4 :(得分:0)

我的建议是在这种情况下使用ListView或GridView,并将文件名保存在ArrayList中。然后你做这样的事情:

List<String> urlList = new ArrayList<String>();
urlList.add("file:///android_asset/chapter/chapter1.html");
urlList.add("file:///android_asset/chapter/chapter2.html");
// and so on

ListView listView = (ListView)findViewById(R.id.listView);
ArrayAdapter adapter = new ArrayAdapter(this, android.R.id.simple_list_item_1, urlList);
        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                    Intent intent = new Intent(this, Webview.class);
                    intent.putExtra("weblink", urlList.get(position));
                    startActivity(intent);

            }
        });

这将是一个很好的实现,因为你可以避免使用100个按钮和OnClickListeners来保存一些资源。

编辑:此代码应该正在运行,只需将其放在onCreate()中进行一些测试。您所要做的就是在layout.xml中定义一个ListView,如下所示:100个按钮:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  android:orientation="vertical"  
  android:layout_width="match_parent"  
  android:layout_height="match_parent">  

    <ListView android:layout_width="match_parent"   
      android:layout_height="match_parent"   
      android:id="@+id/listView">  
    </ListView>  

</LinearLayout>

如果你真的想用Buttons而不是按照morgano的建议。

答案 5 :(得分:-5)

public void webClick(View v) 
{
    Intent intent = new Intent(this, Webview.class);

    switch(v.getId())
    {
        case R.id.button1:
            intent.putExtra("weblink","file:///android_asset/chapter/chapter1.html");
            startActivity(intent);
            break;

        case R.id.button2:
            intent.putExtra("weblink","file:///android_asset/chapter/chapter2.html");
            startActivity(intent);
            break;

        case R.id.button3:
            intent.putExtra("weblink","file:///android_asset/chapter/chapter3.html");
            startActivity(intent);
            break;
.
.
.
.

        case R.id.button100:
            intent.putExtra("weblink","file:///android_asset/chapter/chapter100.html");
            startActivity(intent);
            break;
        default:
            break;
     }

}