【问题标题】:setonlongclicklistener for several buttons at oncesetonlongclicklistener 同时用于多个按钮
【发布时间】:2013-02-26 07:11:02
【问题描述】:

我希望按钮 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 中更改,无论长按哪个按钮:( 出了什么问题以及如何以简单的方式解决它?

【问题讨论】:

  • 超出范围:为什么要存储对活动上下文的强引用?我认为这是不好的做法,请删除属性 Context context 并在需要时使用 this

标签: android onlongclicklistener long-click


【解决方案1】:

试试这个

button.setOnLongClickListener(new longClcik());


class longClcik implements OnLongClickListener {

    public boolean onLongClick(View v) {
        return false;

    }
}

【讨论】:

    【解决方案2】:

    试试这个..替换下面的代码

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

    【讨论】:

      【解决方案3】:

      您应该使用传递给OnLongClickListenerView。这将为您提供当前单击的视图并更新其值,因此请改为这样做

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

      【讨论】:

      • 不起作用。我尝试了你们的建议,@Praful Bhatnagar,但 Eclipse 抱怨“不能在以不同方法定义的内部类中引用非最终变量 v”。这就是我将 botonEditable 定义为全局变量的原因,所有方法都可以看到这一点,对吗?我只是一个直观的安卓开发者。我知道我必须阅读有关 Java 的更多信息。
      【解决方案4】:

      我找到了解决方案,在我的代码中我只是替换了行

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

      这个

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

      加上你的建议:

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

      现在,一切都好。 谢谢你们,你们的帮助让我无法解决问题。
      :)

      【讨论】:

        【解决方案5】:

        我是这样做的:

        1. 首先你必须实现你的类 View.OnLongClickListener
        2. 第二个覆盖方法 onLongClick

          @Override
          public boolean onLongClick(View v) {
          onCheckboxLongClicked(v);
          返回真;
          }

        3. 创建方法 onCheckBoxLongClicked 无效。或者你可以在 onLongClick 中实现你的开关

          switch(view.getId()) {
          案例 R.id.cbDigits:
          Toast.makeText(getActivity(), "消息", Toast.LENGTH_SHORT).show();
          休息;
          .
          .
          .
          }

        抱歉,我仍然不知道如何格式化代码以获取缩进...

        【讨论】:

        • 谢谢Maruban,我会在以后的作品中考虑你的建议。现在我正在处理 Blender 和 VBA Excel,所以现在有几个 Android 项目被推迟了,但我很快就会接受它们。
        猜你喜欢
        • 1970-01-01
        • 2012-11-08
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        相关资源
        最近更新 更多