여러 버튼의 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.