【问题标题】:how to handle long click in Android如何处理Android中的长按
【发布时间】:2012-03-24 07:07:52
【问题描述】:

我是 Android 开发新手。我处理点击的方式是在按钮的清单文件中设置android:onClick 属性。我想知道的是一般处理长点击的最佳方式。我已经阅读了有关实现onLongClick() 的信息,但是有没有办法使用处理程序(如上),而不必扩展视图?这将非常有帮助,因为我宁愿不必使用扩展的 View 类来重建我的整个项目。

编辑

我应该澄清一下。我有一个ListView,我想设置当我长按列表中的一个元素时会发生什么。列表中的每个元素都是一个TextView。根据其中一个答案,我添加了以下代码,现在我强制关闭:

public class TwitterActivity extends ListActivity {
    List<String> tweets = new LinkedList<String>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setListAdapter(new ArrayAdapter<String>(this, R.layout.layout, tweets));

            TextView view = (TextView) findViewById(R.id.ListTemplate);
            view.setOnLongClickListener(new OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    Toast toast = new Toast(TwitterActivity.this);
                    toast.setText("LongClick");
                    toast.show();

                    return true;
                }
            });

    //...
    }
}

【问题讨论】:

  • 检查我用于 ListActivity 的更新答案

标签: java android long-click


【解决方案1】:

对于 ListActivity,如果您想响应对列表元素的长时间点击,请执行以下操作:

public class TwitterActivity extends ListActivity {
    List<String> tweets = new LinkedList<String>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setListAdapter(new ArrayAdapter<String>(this, R.layout.layout, tweets));
            ListView lv = getListView();
            lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){ 
                   @Override 
                   public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) 
                  { 
                       Toast.makeText(TwitterActivity.this, "LongClick", Toast.LENGTH_LONG).show();
                  } 
             }); 

    }
}

对于常规活动,您可以这样做:

public class MyActivity extends Activity implements View.onLongClickListener {

   View myView = null;


   public void onCreate(Bundle state) {
      super.onCreate(state);
      setContentView(R.layout.my_activity);
      myView = findViewById(r.id.my_view);
      myView.setOnLongClickListener(this);
   }

   @Override
   public void onLongClick(View v) {
    //long clicked
   }

}

【讨论】:

    【解决方案2】:

    使用 findViewByID 获取按钮的句柄,然后调用 setOnLongClickListener。

    Button b = (Button)findViewByID (R.id.button1);
    b.setOnLongClickListener(new OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            //to do
        }
    });
    

    【讨论】:

    • 我试过这个,但是没有用。我正在使用 ListView 并将 List 的每个元素作为 TextView。我的代码在上面的编辑中。
    • 我看到您使用的是 R.layout.layout,它看起来不正确。您必须指定您正在使用的 TextView 的 id(应该在 R.id 中)
    • 即使我更改为R.id.ListTemplate,仍然强制关闭
    • 有什么异常?这可能是一个空指针异常。确保该视图不为空。
    • 03-06 14:08:31.349: E/AndroidRuntime(393): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.mitre.ewortzman/org.mitre.ewortzman.TwitterActivity}: java.lang.NullPointerException 如何确保它不为空?我会在一分钟后发布我的活动课程
    【解决方案3】:

    当然这很简单:

    ImageButton i = (ImageButton) findViewById(R.id.myButton);
    i.setOnLongClickListener(new myLongListener());
    
    private class myLongListener implements View.OnLongClickListener {
        @Override
        public void onClick(View v) {
            //your code here
        }
    }
    

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      在大多数情况下,您不必扩展 View 类。 View 有一个名为 setOnLongClickListener 的方法,您可以直接使用它,因为所有派生类,如 ButtonTextView 等也将具有。

      【讨论】:

        【解决方案5】:

        唯一具有 XML 属性的事件处理程序是 android:onClick。所有其他事件处理程序都是在运行时从 Java 代码注册的。从技术上讲,即使android:onClick 是在运行时从 Java 代码注册的,但您不必编写有问题的 Java 代码。

        所以你需要做这样的事情:

        View.OnLongClickListenerhandler = View.OnLongClickListener() {
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.myButton: // doStuff
                        break;
                    case R.id.myOtherButton: // doStuff
                        break;
                }
            }
        }
        
        findViewById(R.id.myButton).setOnLongClickListener(handler);
        findViewById(R.id.myOtherButton).setOnLongClickListener(handler);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-30
          相关资源
          最近更新 更多