여러 버튼의 OnClickListener () android


85

현재 Android에서 간단한 계산기 앱을 만들고 있습니다. 숫자 버튼을 누르면 해당 숫자로 계산기 화면이 업데이트되도록 코드를 설정하려고합니다. 현재 저는 이렇게하고 있습니다.

    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");
        }
    });

작동하지만 계산기의 모든 버튼에 대해 동일한 코드를 작성하고 있습니다. 당신이 상상할 수 있듯이 그것은 매우 중복됩니다. 어쨌든이 코드를보다 효율적인 방법으로 작성할 수 있습니까? 모든 버튼에 대해이 방법을 작성하지 않는 것이 포함 된 것입니까?


클래스에서 온 클릭 리스너를 구현, 그것은 온 클릭하면 작업을 할 수 있습니다 버튼 ID를 method.Based 우선합니다
— 학습자

Boopathi, 버튼 하나를 코딩하는 방법에 대해 자세히 설명해 주시겠습니까? "this"를 사용하여 번호에 액세스 할 수 있도록 버튼 ID "1"을 만들었습니다. 그래도 TextView를 어떻게 편집할지 모르겠습니다.
— user3011685

답변:


242

당신은 단순히 쉽게 만들기 위해 다음 단계를 따라야합니다 ...

onClickListener모든 것에 대해 새로 작성할 필요가 없습니다 . / ..에 Button구현 View.OnClickLister하십시오 . , TextView` 등에 대한 onClick 이벤트를 처리하기 위해 호출 되는 새 메소드를 구현합니다 .ActivityFragmentonClick()Button

  1. 구현 OnClickListener()당신에 Activity/Fragment
public class MainActivity extends Activity implements View.OnClickListener {

}
  1. 활동 / 조각에 onClick () 메서드 구현
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..
    }
}
  1. OnClickListener()버튼 구현
@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);
}
  1. ID로 버튼 찾기 및 코드 구현 ..
@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;
    }
}

자세한 내용은이 링크를 참조하십시오.

https://androidacademic.blogspot.com/2016/12/multiple-buttons-onclicklistener-android.html (업데이트 됨)

이렇게하면 많은 버튼 클릭 이벤트를 더 쉽게 처리 할 수 ​​있고 관리가 간단 해 보입니다.


포인트 4 : 메서드가 수퍼 클래스의 메서드를 재정의하지 않는다고 경고하는 @Override 태그에 오류가 발생합니다.
— KasparTr

@ user2984127 어떤 경우입니까? 조각이나 활동과 함께 사용하고 있습니까?
— Pragnesh Ghoda シ

@ user2984127 View.OnClickListener 구현을 시도하십시오.
— Pragnesh Ghoda シ

Eclipse를 사용하는 동안이 방법을 여러 번 사용했지만 이제 Android Studio로 전환하고 "Android 라이브러리 모듈의 switch 문에서 리소스 ID를 사용할 수 없습니다."라는 오류가 발생합니다. SDK 도구 R14부터 리소스 ID는 최종이 아닙니다. 권장되는 수정 사항은 스위치를 if / else 문으로 바꾸는 것입니다.
— Scorpio

@Scorpio : 안드로이드 스튜디오도 사용하고 있습니다. 그러나 나는 결코 그 오류를 얻지 못했습니다. 올바른 방법을 사용하고 있는지,를 사용 view.getId()하면 클릭 한 버튼의 ID를 받는지 확인하십시오. 이것은 예입니다, 당신은 당신의 필요에 따라 몇 가지 변경을했습니다. 건배. :)
— Pragnesh Ghoda シ April

53

속성을 설정할 수 있습니다.

android:onClick="buttonClicked"

각 버튼에 대한 xml 파일에서 다음을 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
    }

}

4
더 나은 스위치 사용
— 알리 카키

1
@AliKhaki switch는 경우에 따라 작동하지 않을 수 있습니다. 여기에 설명 : tools.android.com/tips/non-constant-fields
— 안드로

8

각 버튼의 태그를 작업하려는 항목 (이 경우 정수)으로 설정합니다. 그런 다음 모든 버튼에 대해 하나의 OnClickListener 만 필요합니다.

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);

1
참조 이 답변 에 대한 태그를 사용하는 것에 대한
— 헨릭 크리스텐슨

8

View.OnClickListener를 구현하는 전용 클래스를 만들었습니다.

public class ButtonClickListener implements View.OnClickListener {

    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "Button Clicked", Toast.LENGTH_SHORT).show();
    }

}

그런 다음 MainActivity에서이 클래스의 인스턴스를 만들었습니다.

private ButtonClickListener onClickBtnListener = new ButtonClickListener();

버튼에 onClickListener를 설정하십시오.

btn.setOnClickListener(onClickBtnListener);

작동하지만 두 개 이상의 버튼을 사용하는 경우 항상 동일한 리스너를 호출하므로 각 버튼의 ID와 함께 onClick 메서드에 스위치 케이스를 추가해야합니다.
— lebarillier

당신은이 문제를 완화 할 버튼 당 클래스 인스턴스 작성하면 나는 믿고있어
— 매트 스트롬

3
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);
        }
    }
}

1

나는 비슷한 문제가 있었고 내가 한 일은 : 버튼 배열 만들기

Button buttons[] = new Button[10];

그런 다음 클릭 리스너를 구현하고 xml ID를 참조하기 위해 다음과 같은 루프를 사용했습니다.

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);
    }

그러나 이들을 호출하는 것은 Prag의 답변 포인트 4와 동일하게 유지됩니다. PS- 누구든지 버튼의 모든 onClick을 호출하는 더 좋은 방법이 있다면 의견을 보내주십시오.


1
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;
    }
}

1

이것을 사용할 수 있습니다

    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); 
}

별도의 방법으로 활동의보기를 식별 할 수 있습니다.


1

Activity / Fragment 공용 클래스 MainActivity extends Activity에서 onClick () 메서드를 구현하여 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..
    }
}

0

목록에 추가하여 긴 if / else 체인 (또는 스위치)을 사용하는 findViewById(btn).setOnClickListener(this)것이 추악 하다는 것을 알았습니다 . 재정의를 사용하여 새 View.OnlickListeners를 인라인으로 만드는 방법은 다음과 같습니다.

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(); }});

0

다른 것 또는 스위치가 필요하지 않습니다. 시작합시다 : 모든 버튼 또는 그것이 무엇이든 (나는 ImageView를 사용하고 있습니다),이 속성 추가 android:onClick="DoSomeThing"

활동에서 :

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");
 

}

이런 식으로 ID, 클릭 리스너, 중복 코드없이 위와 같이 간단하게 뷰를 찾을 필요가 없습니다!
— Zubair Younas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.