generic listener for buttons in a layout of android?
Scenario: I have three buttons defined in xml
<button android:id="@+id/firs开发者_StackOverflowtbtn"
...
/>
<button android:id="@+id/secbtn"
...
/>
<button android:id="@+id/thirdbtn"
...
/>
In Java one way to listen to them is Button firstbtn = (Button) findViewById(R.id.firstbtn); firstbtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Toast.makeText(getBaseContext(), "You have clicked first button", Toast.LENGTH_SHORT).show(); } });
for second btn , same code has to be repeated with different id ??
How can I make it generic enough that , it can listen to all buttons (say in for loop) and while handling I should be able to differentiate different btns. (may be get elements id)Instead of a huge set of findViewById
calls I rather like to use the onClick="methodName"
xml attribute. For example:
<LinearLayout ...>
<Button android:text="1" onClick="onButtonClicked" clickable="true" />
<Button android:text="2" onClick="onButtonClicked" clickable="true" />
<Button android:text="3" onClick="onButtonClicked" clickable="true" />
<Button android:text="4" onClick="onButtonClicked" clickable="true" />
</LinearLayout>
In the activity where the layout is shown just add a method
public void onButtonClicked(View v){
// do whatever needs to be done. For example:
Toast.makeText(getApplicationContext(), ((Button) v).getText() + " clicked", Toast.LENGTH_SHORT).show();
}
You can also put the onClick and clickable attributes into the res/styles.xml file to save even more typing:
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="clickable_button" >
<item name="android:onClick" >onButtonClicked</item>
<item name="android:clickable" >true</item>
</style>
</resources>
Your layout is then simplified to
<LinearLayout ...>
<Button android:text="1" style="@style/clickable_button" />
<Button android:text="2" style="@style/clickable_button" />
<Button android:text="3" style="@style/clickable_button" />
<Button android:text="4" style="@style/clickable_button" />
</LinearLayout>
You need not repeat same code for all. You can try out a generic listener, like :
private OnClickListener mCorkyListener = new OnClickListener() {
public void Click(View v) {
// do something
}
};
Then all you have to do is register all three buttons to use this mCorkyListener. That is, inside onCreate(),
Button firstbtn = (Button) findViewById(R.id.firstbtn);
Button secondbtn = (Button) findViewById(R.id.secondbtn);
Button thirdbtn = (Button) findViewById(R.id.thirdbtn);
firstbtn.setOnClickListener(mCorkyListener);
secondbtn.setOnClickListener(mCorkyListener);
thirdbtn.setOnClickListener(mCorkyListener);
Look here for code samples. You have to use findViewById
to "find" you r buttons though.
You Just Simply have to Follow these steps for making it easy...
You don't have to write new onClickListener for Every Button... Just Implement View.OnClickLister to your Activity/Fragment.. it will implement new Method called onClick() for handling onClick Events for Button,TextView etc.
1-Implement OnClickListener() in your Activity/Fragment
public class MainActivity extends Activity implements View.OnClickListener {
}
2-Implement onClick() method in your Activity/Fragment
public class MainActivity extends Activity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onClick(View v) {
// default method for handling onClick Events..
}
}
3-Implement OnClickListener() For Buttons
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
Button one = (Button) findViewById(R.id.oneButton);
one.setOnClickListener(this); // calling onClick() method
Button two = (Button) findViewById(R.id.twoButton);
two.setOnClickListener(this);
Button three = (Button) findViewById(R.id.threeButton);
three.setOnClickListener(this);
}
4-Find Buttons By Id and Implement Your Code
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.oneButton:
// do your code
break;
case R.id.twoButton:
// do your code
break;
case R.id.threeButton:
// do your code
break;
default:
break; }}
精彩评论