setonlongclicklistener для нескольких кнопок одновременно

Я хочу, чтобы кнопка 1,2,3 отвечала на лонгклик, пользователю будет предложено ввести текстовую кнопку. Внутри onCreate я написал:

Button botonEditable;
Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    context = MainActivity.this;
    Resources r = getResources();
    String pName = getPackageName();

    for (int i=1;i<4;i++){
    botonEditable = (Button) findViewById(r.getIdentifier("button" + i, "id", pName));
    botonEditable.setOnLongClickListener(new View.OnLongClickListener() {
        public boolean onLongClick(View v) {
            final AlertDialog.Builder alert = new AlertDialog.Builder(context);
            alert.setMessage("Nueva Categoria:");
            final EditText input = new EditText(context);
            alert.setView(input);
            alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton  ) {
                    // Do something with value!
                    String newCateg = input.getText().toString();
                    botonEditable.setText(newCateg);
                }
            });

            alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    // Canceled.
                }
            });        
            alert.show();                   
            return true;
        }
    });
    }
 }

Когда это проверено, 3 кнопки реагируют соответственно, чтобы показать предупреждающее сообщение, но когда я ввожу текст и нажимаю ОК, текст изменяется только в button3, независимо от того, какая кнопка была нажата долго:(Что это не так и как исправить это в простой способ?

5 ответов

Решение

Я нашел решение, в моем коде я просто заменил строку

public boolean onLongClick(View v) {....

этим

public boolean onLongClick(final View v) {....

плюс ваши предложения:

((Button)v).setText(newCateg.toUpperCase());

Теперь все в порядке. Спасибо вам, ребята, ваша помощь оставила меня в миллиметрах от решения.
:)

Попробуй это

button.setOnLongClickListener(new longClcik());


class longClcik implements OnLongClickListener {

    public boolean onLongClick(View v) {
        return false;

    }
}

Попробуйте это.. Замените следующий код

 public void onClick(DialogInterface dialog, int whichButton  ) {
                    // Do something with value!
                    String newCateg = input.getText().toString();
                    botonEditable.setText(newCateg);
                }

с

 public void onClick(DialogInterface dialog, int whichButton  ) {
                    // Do something with value!
                    String newCateg = input.getText().toString();
                    ((Button)v).setText(newCateg);
                }

Вы должны использовать View перешел к OnLongClickListener, Это даст вам текущее нажатое представление и обновит его значение, поэтому вместо этого сделайте это

botonEditable.setOnLongClickListener(new View.OnLongClickListener() {
    public boolean onLongClick(View v) {
        final AlertDialog.Builder alert = new AlertDialog.Builder(context);
        alert.setMessage("Nueva Categoria:");
        final EditText input = new EditText(context);
        alert.setView(input);
        alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton  ) {
                // Do something with value!
                String newCateg = input.getText().toString();
                ((Button)v).setText(newCateg); //<-- see the botonEditable changed to v
            }
        });

        alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                // Canceled.
            }
        });        
        alert.show();                   
        return true;
    }
});

Я делаю это так:

  1. Сначала вы должны реализовать в своем классе View.OnLongClickListener
  2. Второй метод переопределения onLongClick

    @Override
    public boolean onLongClick (View v) {
    onCheckboxLongClicked (v);
    вернуть истину;
    }

  3. Создайте метод onCheckBoxLongClicked, который является недействительным. Или вы можете реализовать свой Swith внутри OnLongClick

    switch (view.getId ()) {
    case R.id.cbDigits:
    Toast.makeText (getActivity (), "Message", Toast.LENGTH_SHORT).show ();
    перерыв;
    ,
    ,
    ,
    }

Извините, но я до сих пор не знаю, как отформатировать код, чтобы получить отступ...

Другие вопросы по тегам