9 个不同的 TextView 的相同 OnClickListener

Same OnClickListener for 9 different TextViews

我有以下 9 个 TextView:

TextView option1 = (TextView) findViewById(R.id.option1);
TextView option2 = (TextView) findViewById(R.id.option2);
TextView option3 = (TextView) findViewById(R.id.option3);
TextView option4 = (TextView) findViewById(R.id.option4);
TextView option5 = (TextView) findViewById(R.id.option5);
TextView option6 = (TextView) findViewById(R.id.option6);
TextView option7 = (TextView) findViewById(R.id.option7);
TextView option8 = (TextView) findViewById(R.id.option8);
TextView option9 = (TextView) findViewById(R.id.option9);

而且所有这些在点击时都会执行完全相同的操作。基本上我想要点击每个 TextView 来获取它的文本并显示带有该文本的 Toast(现在)。

我已经为选项 1 设置了点击侦听器,但必须有一种方法可以由此创建可重用函数,而不是为每个 TextView 复制代码...

option1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mSelectedOption = option1.getText().toString();
        Toast.makeText(MainActivity.this, mSelectedOption, Toast.LENGTH_SHORT).show();
    }
});

您可以为您的 TextView 执行此操作:

@Override
public void onCreate(Bundle savedInstanceState) {
        button1.setOnClickListener(onClickListener);
        button2.setOnClickListener(onClickListener);
        button3.setOnClickListener(onClickListener);
}

private OnClickListener onClickListener = new OnClickListener() {
     @Override
     public void onClick(View v) {
         switch(v.getId()){
             case R.id.button1:
                  //DO something
             break;
             case R.id.button2:
                  //DO something
             break;
             case R.id.button3:
                  //DO something
             break;
         }

   }
};

我了解到您没有使用按钮,只是将按钮信息替换为 TextView 名称。

您还可以在 xml 文件中为文本视图定义所有点击监听器,如下所示:

<TextView android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:onClick="textViewOnClick"
        android:layout_height="wrap_content"
        android:text="Random TextView" />

然后您可以创建一个名为 textViewOnClick 的方法,它使用 switch 语句:

public void buttonOnClick(View view)
{
 switch(view.getId())
 {
  case R.id.button1:
  // Code for button 1 click
  break;

  case R.id.button2:
  // Code for button 2 click
  break;

  case R.id.button3:
  // Code for button 3 click
  break;
 }
}

您可以从根视图获取所有视图

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    View v = findViewById(R.id.root);
    for(int index = 0; index<((ViewGroup)v).getChildCount(); ++index) {
        View nextChild = ((ViewGroup)v).getChildAt(index);
        nextChild.setOnClickListener(listener);
    }
}

View.OnClickListener listener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.id1:{

            }
            case R.id.id2:{

            }

        }
    }
};

}

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="vb.com.broadcaster.MainActivity">

<TextView
    android:id="@+id/id1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/id2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

不需要switch声明。您可以只使用 Map 个资源 ID 到 TextViews:

public class MainActivity extends AppCompatActivity {

    private static final int[] IDS = {
        R.id.option1, R.id.option2, R.id.option3, R.id.option4, R.id.option5, R.id.option6, R.id.option7, R.id.option8, R.id.option9
    };

    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mSelectedOption = mOptions.get(v.getId()).getText().toString();
            Toast.makeText(MainActivity.this, mSelectedOption, Toast.LENGTH_SHORT).show();
        }
    };

    private final Map<Integer, TextView> mOptions = new HashMap();

    private String mSelectedOption;

    private void initOptions() {
        for (int id : IDS ) {
            TextView option = (TextView) findViewById(id);
            option.setOnClickListener(onClickListener);
            mOptions.put(id, option);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        .
        .
        .
        initOptions();
    }

}