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 到 TextView
s:
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();
}
}
我有以下 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 到 TextView
s:
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();
}
}