Nhiều nút 'OnClickListener () android


83

Tôi hiện đang tạo một ứng dụng máy tính đơn giản trên Android. Tôi đang cố gắng thiết lập mã để khi một nút số được nhấn, nó sẽ cập nhật màn hình máy tính với số đó. Hiện tại tôi đang làm như thế này.

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

Nó hoạt động nhưng tôi đang viết mã tương tự này cho mọi nút trên máy tính. Như bạn có thể tưởng tượng nó là rất thừa. Có cách nào để tôi có thể viết mã này theo cách hiệu quả hơn không? Một trong đó liên quan đến việc không viết phương thức này cho mọi nút?


thực hiện nghe onclick trong lớp học của bạn, nó sẽ ghi đè onclick method.Based vào nút id bạn có thể làm cho các hoạt động
học

Boopathi, bạn có thể giải thích thêm về cách tôi sẽ viết mã cho một nút không? Tôi đã tạo id nút "1" theo cách đó tôi có thể sử dụng "this" để truy cập số. Tôi không chắc sau đó tôi sẽ chỉnh sửa TextView như thế nào.
user3011685

Câu trả lời:


240

Bạn chỉ cần làm theo các bước sau để làm cho nó dễ dàng ...

Bạn không cần phải viết mới onClickListenercho Mọi Button... Chỉ cần Triển khai View.OnClickListercho Activity/ Fragment.. của bạn, nó sẽ triển khai Phương thức mới được gọi onClick()để xử lý Sự kiện onClick cho Button, TextView`, v.v.

  1. Triển khai OnClickListener()trong Activity/ của bạnFragment
public class MainActivity extends Activity implements View.OnClickListener {

}
  1. Triển khai phương thức onClick () trong Activity / Fragment của bạn
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. Triển khai OnClickListener()cho các nút
@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. Tìm các nút theo Id và triển khai mã của bạn ..
@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;
    }
}

Vui lòng tham khảo liên kết này để biết thêm thông tin:

https://androidacademic.blogspot.com/2016/12/multiple-buttons-onclicklistener-android.html (đã cập nhật)

Điều này sẽ giúp dễ dàng xử lý các sự kiện nhấp vào nhiều nút và làm cho việc quản lý nó trông đơn giản ...


Điểm 4: Tôi gặp lỗi trên thẻ @Override cảnh báo tôi rằng phương thức không ghi đè phương thức của nó từ lớp cha.
KasparTr

@ user2984127 dùng cho trường hợp nào? bạn đang sử dụng nó với phân mảnh hoặc hoạt động?
Pragnesh Ghoda シ

@ user2984127 hãy thử triển khai View.OnClickListener.
Pragnesh Ghoda シ

Tôi đã sử dụng phương pháp này nhiều lần trong khi sử dụng Eclipse, nhưng bây giờ tôi đã chuyển sang Android Studio và gặp lỗi "Không thể sử dụng ID tài nguyên trong câu lệnh chuyển đổi trong mô-đun thư viện Android". Đối với các công cụ SDK R14, ID tài nguyên không phải là cuối cùng. Cách khắc phục được khuyến nghị là thay thế công tắc bằng câu lệnh if / else.
Scorpio

@Scorpio: Tôi cũng đang sử dụng studio android. Nhưng tôi không bao giờ mắc lỗi đó. Vui lòng kiểm tra xem bạn đang sử dụng các phương pháp thích hợp và khi sử dụng view.getId(), bạn đang nhận được ID của nút được nhấp. Đây là một ví dụ, bạn có thể thực hiện một số thay đổi tùy thuộc vào nhu cầu của bạn. Chúc mừng. :)
Pragnesh Ghoda シ

53

Bạn có thể đặt thuộc tính:

android:onClick="buttonClicked"

trong tệp xml cho mỗi nút đó và sử dụng nút này trong mã 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
tốt hơn để sử dụng chuyển đổi
Ali Khaki

1
@AliKhaki switchcó thể không hoạt động trong một số trường hợp. Giải thích ở đây: tools.android.com/tips/non-constant-fields
Andro

8

Đặt Thẻ trên mỗi nút thành bất kỳ thứ gì bạn muốn làm việc, trong trường hợp này có thể là Số nguyên. Sau đó, bạn chỉ cần một OnClickListener cho tất cả các nút của mình:

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
Xem thêm câu trả lời này về việc sử dụng Thẻ cho những gì
Henrik Christensen

8

Tôi đã tạo lớp chuyên dụng triển khai View.OnClickListener.

public class ButtonClickListener implements View.OnClickListener {

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

}

Sau đó, tôi đã tạo một phiên bản của lớp này trong MainActivity

private ButtonClickListener onClickBtnListener = new ButtonClickListener();

và sau đó đặt onClickListener cho nút

btn.setOnClickListener(onClickBtnListener);

hoạt động, nhưng nếu bạn sử dụng nhiều nút, bạn sẽ luôn gọi cùng một Trình xử lý, bạn nên thêm trường hợp chuyển đổi trong phương thức onClick của mình với id của mỗi nút.
lebarillier

Tôi giả định nếu bạn tạo một phiên bản lớp cho mỗi nút cũng sẽ giảm bớt mối lo ngại này
Matt Strom

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

Tôi đã gặp sự cố tương tự và những gì tôi đã làm là: Tạo một mảng các Nút

Button buttons[] = new Button[10];

Sau đó, để triển khai trên trình nghe nhấp chuột và id xml tham chiếu, tôi đã sử dụng một vòng lặp như thế này

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

Nhưng việc gọi chúng lên vẫn giống như trong câu trả lời của Prag 4. Tái bút- Nếu ai có phương pháp tốt hơn để gọi lên tất cả các nút onClick, vui lòng bình luận.


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

Bạn có thể sử dụng cái nà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); 
}

bạn có thể xác định các chế độ xem trong hoạt động của mình theo một phương pháp riêng.


1

Triển khai phương thức onClick () trong lớp công khai Activity / Fragment MainActivity mở rộng Activity triển khai 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

Tôi thấy rằng việc sử dụng một chuỗi if / else dài (hoặc chuyển đổi), ngoài danh sách findViewById(btn).setOnClickListener(this)là xấu. làm thế nào về việc tạo View.OnlickListaries mới với ghi đè, nội dòng:

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

Không cần nếu khác hoặc chuyển đổi, Hãy bắt đầu: Trong mọi Nút của bạn hoặc bất kỳ nút nào (tôi đang sử dụng ImageView), Thêm thuộc tính này android:onClick="DoSomeThing"

Trong Hoạt động của bạn:

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

}

Với cách này, không cần tìm lượt xem theo id, không cần người nghe nhấp chuột, không cần mã thừa, đơn giản như trên!
Zubair Younas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.