如何在安卓中处理长按事件

3
我是Android开发的新手。我一直通过在按钮的清单文件中设置android:onClick属性来处理点击事件。我想知道通常处理长按事件的最佳方法。我已经阅读了关于实现onLongClick()的文章,但是否有一种方法可以像上面那样使用处理程序,而不必扩展View?这将非常有帮助,因为我不想使用一个扩展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。 - Matt Wolfe
5个回答

6

如果你想对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,并将列表的每个元素作为TextView。我的代码在上面的编辑中。 - ewok
即使我更改为R.id.ListTemplate,仍然强制关闭。 - ewok
什么是异常?很可能是空指针异常。确保视图非空。 - jsimpson
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如何确保它是非空的?我一会儿会发布我的活动类。 - ewok
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/8597/discussion-between-ewok-and-jeremys - ewok
显示剩余2条评论

1

这很简单:

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

希望这能帮到你!


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

0

唯一具有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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接