如何处理Android中的长按
Posted
技术标签:
【中文标题】如何处理Android中的长按【英文标题】:how to handle long click in 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 的更新答案 【参考方案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 ComponentInfoorg.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
的方法,您可以直接使用它,因为所有派生类,如 Button
或 TextView
等也将具有。
【讨论】:
【参考方案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);
【讨论】:
以上是关于如何处理Android中的长按的主要内容,如果未能解决你的问题,请参考以下文章