Android 按钮 - 如何将 focusable 设置为 true 并在第一次单击时仍然接受 onClick 侦听器?

2023-11-23

UPDATE

我通过从按钮样式中删除两条可聚焦线并使用 onClick 事件处理程序来调用来解决了点击问题requestFocusFromTouch();

不幸的是,我遇到了 requestFocusFromTouch() 聚焦错误按钮的问题。它始终聚焦第一个按钮,而不是我调用该方法的按钮。这是 Android 错误还是预期行为?我可以做些什么来解决这个问题?

onClick 事件的代码现在如下所示

public void onClick(View v) {
    switch (v.getId()) {
            case R.id.btn_home:
                Intent i = new Intent(this, QuizMenu.class);
                startActivity(i);
                v.requestFocusFromTouch();
            break;
            case R.id.btn_support:
                Intent i1 = new Intent(this, Support.class);
                startActivity(i1);
                v.requestFocusFromTouch();
                View btnSupport = findViewById(R.id.btn_support);
                btnSupport.setSelected(true);
                btnSupport.requestFocusFromTouch();
            break;
            // More buttons go here (if any) ...
    }
}

更新结束

我有一个具有以下样式的 Android 按钮

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MnuBtnStyle">
        <item name="android:ellipsize">marquee</item>
        <item name="android:scrollHorizontally">true</item>
        <item name="android:focusable">true</item>
        <item name="android:focusableInTouchMode">true</item>
        <item name="android:singleLine">true</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_marginTop">1dip</item> 
        <item name="android:layout_marginBottom">1dip</item>
        <item name="android:textSize">10dp</item>
        <item name="android:layout_weight">1</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>

我有一个点击监听器,如下所示

public void onClick(View v) {
    switch (v.getId()) {
            case R.id.btn_home:
                Intent i = new Intent(this, HomeScreen.class);
                startActivity(i);
            break;
            // More buttons go here ...
    }
}

我的按钮上有一个图像,选择器看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
        android:drawable="@drawable/ic_tab_home_pressed" /> <!-- pressed -->
    <item android:state_focused="true"
        android:drawable="@drawable/ic_tab_home_pressed" /> <!-- pressed -->
    <item android:drawable="@drawable/ic_tab_home_unpressed" /> <!-- default/unchecked -->
</selector>

使用按钮和按钮的布局如下所示

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="horizontal"
      android:id="@+id/top_menu_bar"
      android:layout_marginTop="2dip" 
      android:padding="0dip"
      android:background="@android:drawable/bottom_bar"
      android:layout_alignParentTop="true"
      android:gravity="top"
      android:layout_height="@dimen/menu_bar_height"
      android:layout_width="fill_parent">
      <Button
          android:id="@+id/btn_home"
          android:text="@string/btn_home"
          android:drawableTop="@drawable/home_button"
          style="@style/MnuBtnStyle"
      />
...

还有其他按钮,此布局充当顶部菜单栏,包含在任何需要的布局中。

由于可聚焦线,按钮的 onClick 事件仅在第二次单击按钮时触发。

        <item name="android:focusable">true</item>
        <item name="android:focusableInTouchMode">true</item>

第一次单击将焦点设置在按钮上,然后第二次单击触发 onClick 事件侦听器 我需要将两者组合在一起,以便第一次单击设置焦点并触发 onClick 事件侦听器。这可以做到吗?

如果我删除两条可聚焦线,按钮将正常运行,但我想显示该按钮已聚焦,并且我希望按钮内的滚动文本<item name="android:ellipsize">marquee</item>给我

任何想法都非常感激


你可以这样做onClick(View v):

.....
v.setFocusableInTouchMode(true);
v.requestFocus();
v.setFocusableInTouchMode(false);
.....//the others

so, v获得焦点,你可以做一些事情onClick()通过setFocusableInTouchMode(false),它可以接受onClick第一次接触时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 按钮 - 如何将 focusable 设置为 true 并在第一次单击时仍然接受 onClick 侦听器? 的相关文章

随机推荐