Obecnie tworzę prostą aplikację kalkulatora na Androida. Próbuję ustawić kod tak, aby po naciśnięciu przycisku numerycznego aktualizował ekran kalkulatora o ten numer. Obecnie robię to w ten sposób.
Button one = (Button) findViewById(R.id.oneButton);
one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView output = (TextView) findViewById(R.id.output);
output.append("1");
}
});
Działa, ale piszę ten sam kod dla każdego przycisku kalkulatora. Jak możesz sobie wyobrazić, jest to bardzo zbędne. Czy mimo wszystko mogę napisać ten kod w bardziej efektywny sposób? Taki, który polega na tym, że nie pisze się tej metody dla każdego przycisku?
android
onclicklistener
user3011685
źródło
źródło
Odpowiedzi:
Po prostu musisz wykonać następujące kroki, aby ułatwić ...
Nie musisz pisać nowego
onClickListener
dla EveryButton
... Po prostu zaimplementujView.OnClickLister
wActivity
/Fragment
.. zaimplementuje nową metodę o nazwieonClick()
do obsługi zdarzeń onClick dlaButton
, TextView` itp.public class MainActivity extends Activity implements View.OnClickListener { }
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.. } }
@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); }
@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; } }
Więcej informacji można znaleźć pod tym linkiem:
https://androidacademic.blogspot.com/2016/12/multiple-buttons-onclicklistener-android.html (zaktualizowany)
Ułatwi to obsługę wielu zdarzeń związanych z kliknięciami przycisków i sprawi, że zarządzanie nimi będzie proste ...
źródło
view.getId()
otrzymujesz identyfikator klikniętego przycisku. To jest przykład, dokonałeś pewnych zmian w zależności od potrzeb. Twoje zdrowie. :)Możesz ustawić właściwość:
android:onClick="buttonClicked"
w pliku xml dla każdego z tych przycisków i użyj tego w kodzie java:
public void buttonClicked(View view) { if (view.getId() == R.id.button1) { // button1 action } else if (view.getId() == R.id.button2) { //button2 action } else if (view.getId() == R.id.button3) { //button3 action } }
źródło
switch
W niektórych przypadkach @AliKhaki może nie działać. Wyjaśniono tutaj: tools.android.com/tips/non-constant-fieldsUstaw znacznik na każdym przycisku na cokolwiek, z czym chcesz pracować, w tym przypadku prawdopodobnie na liczbę całkowitą. Wtedy potrzebujesz tylko jednego OnClickListener dla wszystkich swoich przycisków:
Button one = (Button) findViewById(R.id.oneButton); Button two = (Button) findViewById(R.id.twoButton); one.setTag(new Integer(1)); two.setTag(new Integer(2)); OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View v) { TextView output = (TextView) findViewById(R.id.output); output.append(v.getTag()); } } one.setOnClickListener(onClickListener); two.setOnClickListener(onClickListener);
źródło
Stworzyłem dedykowaną klasę, która implementuje View.OnClickListener.
public class ButtonClickListener implements View.OnClickListener { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "Button Clicked", Toast.LENGTH_SHORT).show(); } }
Następnie utworzyłem wystąpienie tej klasy w MainActivity
private ButtonClickListener onClickBtnListener = new ButtonClickListener();
a następnie ustaw onClickListener dla przycisku
btn.setOnClickListener(onClickBtnListener);
źródło
public class MainActivity extends AppCompatActivity implements OnClickListener { Button b1,b2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1= (Button) findViewById(R.id.button); b2= (Button) findViewById(R.id.button2); b1.setOnClickListener(this); b2.setOnClickListener(this); } @Override public void onClick(View v) { if(v.getId()==R.id.button) { Intent intent=new Intent(getApplicationContext(),SignIn.class); startActivity(intent); } else if (v.getId()==R.id.button2) { Intent in=new Intent(getApplicationContext(),SignUpactivity.class); startActivity(in); } } }
źródło
Miałem podobny problem i zrobiłem: Utwórz tablicę przycisków
Button buttons[] = new Button[10];
Następnie, aby zaimplementować odbiornik kliknięć i odwołać się do identyfikatorów xml, użyłem takiej pętli
for (int i = 0; i < 10; i++) { String buttonID = "button" + i; int resID = getResources().getIdentifier(buttonID, "id", "your package name here"); buttons[i] = (Button) findViewById(resID); buttons[i].setOnClickListener(this); }
Ale wywołanie ich pozostaje takie samo jak w punkcie odpowiedzi Praga 4. PS- Jeśli ktoś ma lepszą metodę wywoływania wszystkich przycisków onClick, proszę o komentarz.
źródło
public void onClick(View v) { int id = v.getId(); switch (id){ case R.id.button1: //do ur code Toast.makeText(this,"This is button 1",Toast.LENGTH_SHORT).show(); break; case R.id.button2: Intent intent = new Intent(this,SecondActivity.class); Intent.putExtra("key",value); startActivity(intent); break; case R.id.button3: //do ur code break; case R.id.button4: //do ur code; break; default: //do ur code; } }
źródło
Możesz tego użyć
TextView output = (TextView) findViewById(R.id.output); one.setOnClickListener(youractivity.this); // set the onclicklistener for other buttons also @Override public void onClick(View v) { int id = v.getId(); switch(id) { case R.id.oneButton: append("1",output); break; case R.id.twoButton: append("2",output); break; case R.id.threeButton: append("3",output); break; } } private void append(String s,TextView t){ t.setText(s); }
możesz zidentyfikować widoki w swojej działalności w oddzielnej metodzie.
źródło
Zaimplementuj metodę onClick () w swojej publicznej klasie Activity / Fragment MainActivity extends Activity implementuje View.OnClickListener {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onClick(View v) { switch (itemId) { // if you call the fragment with nevigation bar then used. case R.id.nav_menu1: fragment = new IntroductionFragment(); break; // if call activity with nevigation bar then used. case R.id.nav_menu6: Intent i = new Intent(MainActivity.this, YoutubeActivity.class); startActivity(i); // default method for handling onClick Events.. } }
źródło
Uważam, że używanie długiego łańcucha if / else (lub przełącznika) oprócz listy
findViewById(btn).setOnClickListener(this)
jest brzydkie. co powiesz na utworzenie nowego View.OnlickListeners z nadpisaniem, w linii:findViewById(R.id.signInButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { signIn(); }}); findViewById(R.id.signOutButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { signOut(); }}); findViewById(R.id.keyTestButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { decryptThisTest(); }}); findViewById(R.id.getBkTicksButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getBookTickers(); }}); findViewById(R.id.getBalsButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getBalances(); }});
źródło
Nie ma potrzeby przełączania czy innego, zacznijmy: w każdym twoim przycisku lub cokolwiek to jest (używam ImageView), dodaj ten atrybut
android:onClick="DoSomeThing"
W Twojej aktywności:
public void DoSomeThing(View v){ ImageView img1= (ImageView) v; //you have to cast the view i.e. if it's button, it must be cast to Button like below line Button b1= (Button) v; img1.setImageBitmap(imageBitmap); //or anything you want to do with your view, This will work for all b1.setText("Some Text"); }
źródło