如何在 android 中创建类似键盘按键的按钮?
How to create buttons like keyboard keys in android?
这个问题看似微不足道。我想为我的应用程序创建一个类似键盘键的按钮。当我单击它时,该按钮上方会出现一个弹出窗口 window,显示按下的字母。到目前为止,一切都很好,除了一件事。当我将 onFocusChangedListener 添加到按钮时,没有任何反应。我需要让我的按钮充当键盘键,但我不知道怎么做。
正如您在此处看到的,当按钮获得焦点时,会出现一个弹出窗口 window。我想这样做,但 onFocusChangeListener
不起作用。我知道我可以使用 KeyboardView
来实现这一点,但我不想使用它,因为有一些其他问题,例如居中按钮和使用 layout_weight 设置键的高度。所以我需要用普通按钮来制作它。
我尝试了什么:
我的第一次尝试:
button.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
popupWindow.showAtLocation(keyboardPopup, Gravity.NO_GRAVITY, location.left - 10, location.top - button.getHeight());
} else {
popupWindow.dismiss();
}
}
});
结果:什么都没发生。弹出窗口 window 根本没有出现。
编辑: 在我按照 Ashley 的建议添加 button.setFocusableInTouchMode(true);
之后,现在调用了 onFocusChanged,但它的行为如此诡异的。弹出窗口有时显示,但在显示的同时,它永远不会消失...
我的第二次尝试:
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
popupWindow.showAtLocation(keyboardPopup, Gravity.NO_GRAVITY, location.left - 10, location.top - button.getHeight());
break;
case MotionEvent.ACTION_UP:
popupWindow.dismiss();
break;
}
return true;
}
});
结果:这个动作太怪异了。弹出窗口有时会显示,有时不会,但是当它显示时,按钮也不会改变其状态。它应该已经聚焦,但按钮没有任何变化,它就像处于正常状态一样(按钮的背景不会随着我的可绘制对象 xml 中声明的 state_focused 而改变)。 onTouchListener 似乎覆盖了按钮的功能。
这是我的布局的一部分:
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="3">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="Q"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="W"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="E"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="R"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="T"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="Y"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="U"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="I"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="O"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="P"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
<View
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="0.5" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="A"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="S"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="D"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="F"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="G"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="H"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="J"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="K"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="L"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<View
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="0.5" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
<View
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1.5" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="Z"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="X"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="C"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="V"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="B"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="N"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="M"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<View
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1.5" />
</LinearLayout>
</LinearLayout>
代码中:
public void onKeyboardClick(View view) {
//The view pressed is a button.
final Button button = (Button) view;
//Create a PopupWindow.
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
final View keyboardPopup = inflater.inflate(R.layout.keyboard_popup, null);
final PopupWindow popupWindow = new PopupWindow(keyboardPopup, view.getWidth() + 20, view.getHeight());
TextView keyboardKey = (TextView) keyboardPopup.findViewById(R.id.keyboard_key);
keyboardKey.setText(button.getText().toString());
//Get button location to show the popup above it.
int[] keyLocation = new int[2];
button.getLocationOnScreen(keyLocation);
final Rect location = new Rect();
location.left = keyLocation[0];
location.top = keyLocation[1];
location.right = location.left + button.getWidth();
location.bottom = location.top + button.getHeight();
//This is a temporary solution. I don't want to use that.
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Show popup.
popupWindow.showAtLocation(keyboardPopup, Gravity.NO_GRAVITY, location.left - 10, location.top - button.getHeight());
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Dismiss popup.
popupWindow.dismiss();
}
}, 200);
}
});
}
任何帮助将不胜感激。谢谢。
我没有在你的代码中注意到它,但你可能遗漏了。
btn.setFocusableInTouchMode(true);
btn.setFocusable(true);
对于焦点变化监听器。
holder.sAttedenceList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
if (!parent.hasFocus()) {
return;
}
不是完整的代码,而是对我有用的一般结构。
不要设置 OnTouchListener
,而是尝试继承 Button
并覆盖 onTouchEvent
本身:
public class KeyboardButton extends Button
{
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
popupWindow.showAtLocation(keyboardPopup, Gravity.NO_GRAVITY, location.left - 10, location.top - button.getHeight());
break;
case MotionEvent.ACTION_UP:
popupWindow.dismiss();
break;
}
return super.onTouchEvent(event);
}
}
建议你用第二种试试onTouchListener
!
你有 2 个问题:
1.按钮不改变状态
确实,当您覆盖 onTouchListener
时,您必须自己模拟状态。请看一下这个 SO 线程,了解它是如何完成的:
"Press and hold" button on Android needs to change states (custom XML selector) using onTouchListener
2。有时显示有时不显示
这不应该发生,尤其是如果您正确处理了所有相关的触摸事件情况。您将希望在用户按下按钮时显示弹出窗口,并在用户移出按钮(通过向外滑动或将手指离开屏幕)时隐藏弹出窗口。
请尝试以下代码示例:
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
v.setPressed(true);
showPopupWindow(...);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_CANCEL:
v.setPressed(false);
hidePopupWindow(...);
break;
}
return true;
}
});
- 注意使用 getActionMasked 而不是
getAction
来更好地处理多点触控。
- 注意
v.setPressed(...);
- 这将更新按钮状态。
- 注意隐藏弹出窗口的不同情况。
这个问题看似微不足道。我想为我的应用程序创建一个类似键盘键的按钮。当我单击它时,该按钮上方会出现一个弹出窗口 window,显示按下的字母。到目前为止,一切都很好,除了一件事。当我将 onFocusChangedListener 添加到按钮时,没有任何反应。我需要让我的按钮充当键盘键,但我不知道怎么做。
正如您在此处看到的,当按钮获得焦点时,会出现一个弹出窗口 window。我想这样做,但 onFocusChangeListener
不起作用。我知道我可以使用 KeyboardView
来实现这一点,但我不想使用它,因为有一些其他问题,例如居中按钮和使用 layout_weight 设置键的高度。所以我需要用普通按钮来制作它。
我尝试了什么:
我的第一次尝试:
button.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
popupWindow.showAtLocation(keyboardPopup, Gravity.NO_GRAVITY, location.left - 10, location.top - button.getHeight());
} else {
popupWindow.dismiss();
}
}
});
结果:什么都没发生。弹出窗口 window 根本没有出现。
编辑: 在我按照 Ashley 的建议添加 button.setFocusableInTouchMode(true);
之后,现在调用了 onFocusChanged,但它的行为如此诡异的。弹出窗口有时显示,但在显示的同时,它永远不会消失...
我的第二次尝试:
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
popupWindow.showAtLocation(keyboardPopup, Gravity.NO_GRAVITY, location.left - 10, location.top - button.getHeight());
break;
case MotionEvent.ACTION_UP:
popupWindow.dismiss();
break;
}
return true;
}
});
结果:这个动作太怪异了。弹出窗口有时会显示,有时不会,但是当它显示时,按钮也不会改变其状态。它应该已经聚焦,但按钮没有任何变化,它就像处于正常状态一样(按钮的背景不会随着我的可绘制对象 xml 中声明的 state_focused 而改变)。 onTouchListener 似乎覆盖了按钮的功能。
这是我的布局的一部分:
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="3">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="Q"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="W"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="E"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="R"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="T"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="Y"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="U"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="I"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="O"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="P"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
<View
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="0.5" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="A"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="S"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="D"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="F"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="G"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="H"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="J"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="K"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="L"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<View
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="0.5" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
<View
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1.5" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="Z"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="X"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="C"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="V"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="B"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="N"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<Button
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="M"
android:background="@drawable/keyboard_button"
android:textColor="#FFFFFF"
android:onClick="onKeyboardClick" />
<View
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1.5" />
</LinearLayout>
</LinearLayout>
代码中:
public void onKeyboardClick(View view) {
//The view pressed is a button.
final Button button = (Button) view;
//Create a PopupWindow.
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
final View keyboardPopup = inflater.inflate(R.layout.keyboard_popup, null);
final PopupWindow popupWindow = new PopupWindow(keyboardPopup, view.getWidth() + 20, view.getHeight());
TextView keyboardKey = (TextView) keyboardPopup.findViewById(R.id.keyboard_key);
keyboardKey.setText(button.getText().toString());
//Get button location to show the popup above it.
int[] keyLocation = new int[2];
button.getLocationOnScreen(keyLocation);
final Rect location = new Rect();
location.left = keyLocation[0];
location.top = keyLocation[1];
location.right = location.left + button.getWidth();
location.bottom = location.top + button.getHeight();
//This is a temporary solution. I don't want to use that.
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Show popup.
popupWindow.showAtLocation(keyboardPopup, Gravity.NO_GRAVITY, location.left - 10, location.top - button.getHeight());
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Dismiss popup.
popupWindow.dismiss();
}
}, 200);
}
});
}
任何帮助将不胜感激。谢谢。
我没有在你的代码中注意到它,但你可能遗漏了。
btn.setFocusableInTouchMode(true);
btn.setFocusable(true);
对于焦点变化监听器。
holder.sAttedenceList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
if (!parent.hasFocus()) {
return;
}
不是完整的代码,而是对我有用的一般结构。
不要设置 OnTouchListener
,而是尝试继承 Button
并覆盖 onTouchEvent
本身:
public class KeyboardButton extends Button
{
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
popupWindow.showAtLocation(keyboardPopup, Gravity.NO_GRAVITY, location.left - 10, location.top - button.getHeight());
break;
case MotionEvent.ACTION_UP:
popupWindow.dismiss();
break;
}
return super.onTouchEvent(event);
}
}
建议你用第二种试试onTouchListener
!
你有 2 个问题:
1.按钮不改变状态
确实,当您覆盖 onTouchListener
时,您必须自己模拟状态。请看一下这个 SO 线程,了解它是如何完成的:
"Press and hold" button on Android needs to change states (custom XML selector) using onTouchListener
2。有时显示有时不显示
这不应该发生,尤其是如果您正确处理了所有相关的触摸事件情况。您将希望在用户按下按钮时显示弹出窗口,并在用户移出按钮(通过向外滑动或将手指离开屏幕)时隐藏弹出窗口。
请尝试以下代码示例:
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
v.setPressed(true);
showPopupWindow(...);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_CANCEL:
v.setPressed(false);
hidePopupWindow(...);
break;
}
return true;
}
});
- 注意使用 getActionMasked 而不是
getAction
来更好地处理多点触控。 - 注意
v.setPressed(...);
- 这将更新按钮状态。 - 注意隐藏弹出窗口的不同情况。