Android中按钮组的onLongClick监听器
Posted
技术标签:
【中文标题】Android中按钮组的onLongClick监听器【英文标题】:onLongClick listener for group of buttons in Android 【发布时间】:2013-07-01 09:09:21 【问题描述】:在我的 android 应用程序中,我想创建一个像键盘一样工作的片段。我有一个函数,可以处理所有 9 个键的 onClick。我想知道是否只编写一个函数来处理所有这 9 个键的 onLongClick。
这里是布局 xml:
<Button
android:id="@id/testButton"
android:layout_
android:layout_
android:layout_margin="2dp"
android:background="@drawable/keypad_round_button"
android:text="1"
android:textColor="@color/black_1"
android:onClick="keypadSetNote"
android:longClickable="true"/>
<Button
android:id="@id/testButton"
android:layout_
android:layout_
android:layout_margin="2dp"
android:background="@drawable/keypad_round_button"
android:text="2"
android:longClickable="true"
android:textColor="@color/black_1"
android:onClick="keypadSetNote"
/>
这里是 OnlongClick 监听器:
Button button = (Button) findViewById(R.id.testButton);
button.setOnLongClickListener(new View.OnLongClickListener()
public boolean onLongClick(View v)
Button clickedButton = (Button) v;
String buttonText = clickedButton.getText().toString();
Log.v(TAG, "button long pressed --> " + buttonText);
return true;
);
我为所有键提供了相同的 ID 来处理一个函数中的所有 onLongClick 操作,但它只适用于第一个键。无论如何在Android中定义类似组按钮的东西???或者我必须为所有这些单独编写 OnLongClick 侦听器???
【问题讨论】:
您好,您必须点击他们左侧的V
来接受答案。
【参考方案1】:
只需创建一个命名函数而不是匿名函数:
View.OnLongClickListener listener = new View.OnLongClickListener()
public boolean onLongClick(View v)
Button clickedButton = (Button) v;
String buttonText = clickedButton.getText().toString();
Log.v(TAG, "button long pressed --> " + buttonText);
return true;
;
button1.setOnLongClickListener(listener);
button2.setOnLongClickListener(listener);
button3.setOnLongClickListener(listener);
而且,尽管你没有问它,但我们必须警告你:正如@AndyRes 所说,你的按钮必须有不同的 id。具有相同的 ID 并不意味着通过 id 获取按钮将返回所有按钮,只会返回具有该 ID 的第一个按钮,这是因为它只适用于第一个按钮。
【讨论】:
XML 中没有任何 onLongClick 标记,所以我可以通过编程方式设置它。感谢您的回答,我真的很喜欢 @AndyRes 关于首先存储所有 ID 并将所有处理程序设置为循环的想法。 哇,好的,完美。从未尝试通过 XML 实现onLongClick
,所以不知道。将编辑答案。
另外,最好提一下 longClickable 选项应该为其 XML 文件中的每个按钮设置为 true。【参考方案2】:
按钮应该有不同的 id:
<Button
android:id="@id/testButton1"
//... />
<Button
android:id="@id/testButton2"
//... />
<Button
android:id="@id/testButton3"
//... />
现在,要为所有按钮设置监听器,解决方案是获取数组中所有按钮的id
,然后使用“for”循环为每个按钮设置监听器。
像这样:
// Store the id of buttons in an array
int[] ids=R.id.testButton1, R.id.testButton2,R.id.testButton3;
// loop through the array, find the button with respective id and set the listener
for(int i=0; i<ids.length; i++)
Button button = (Button) findViewById(ids[i]);
button.setOnLongClickListener(longClickListener);
View.OnLongClickListener longClickListener = new View.OnLongClickListener()
public boolean onLongClick(View v)
// .....
return true;
;
【讨论】:
您关于首先存储 Id 然后在循环中使用它们的想法使代码更清晰、更具可读性。【参考方案3】:如果您的按钮位于 LinearLayout、RelativeLayour 或其他中。而且你有很多按钮。
View.OnLongClickListener listener = new View.OnLongClickListener()
public boolean onLongClick(View v)
Log.d("ID", ""+v.getId());
switch (v.getId())
case R.id.button1:
//do something for button1
break;
case R.id.button2:
//do something for button2
break;
...
return true;
;
LinearLayout layout=(LinearLayout)findViewById(R.id.IdOfLinearLayout);
for(int i=0;i<layout.getChildCount();i++)
layout.getChildAt(i).setOnLongClickListener(listener);
例如xml文件...
<LinearLayout
android:id=@+id/IdOfLinearLayout"....>
<Button
android:id="@+id/button1"
android:layout_width=...
android:layout_height=...
.../>
<Button
android:id="@+id/button2"
... />
....
<Button
android:id="@+id/buttonN"
.../>
</LinearLayout>
【讨论】:
以上是关于Android中按钮组的onLongClick监听器的主要内容,如果未能解决你的问题,请参考以下文章
Android中onTouchEvent, onClick及onLongClick的调用机制
监听器无法识别 ExpandableListView OnLongClick
onTouch, onLongClick 在 Android 中一起使用