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

jam*_*esc 12 android

UPDATE

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

不幸的是,我遇到了一个问题,即requestFocusFromTouch()聚焦了错误的按钮.它总是聚焦第一个按钮而不是我调用方法的按钮.这是一个安卓漏洞或预期的行为,我可以做些什么来解决这个问题?

对于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) ...
    }
}
Run Code Online (Sandbox Code Playgroud)

更新结束

我有一个具有以下风格的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>
Run Code Online (Sandbox Code Playgroud)

我有一个看起来像这样的点击监听器

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 ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<?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>
Run Code Online (Sandbox Code Playgroud)

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

<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"
      />
...
Run Code Online (Sandbox Code Playgroud)

还有其他按钮,这个布局充当顶级菜单栏,包含在任何布局需要它.

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

        <item name="android:focusable">true</item>
        <item name="android:focusableInTouchMode">true</item>
Run Code Online (Sandbox Code Playgroud)

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

如果我删除两条可聚焦线条,按钮表现正常,但我想显示按钮是聚焦的,我想要按钮内的滚动文字<item name="android:ellipsize">marquee</item>给我

任何想法都非常感激

Fem*_*emi 5

您可能需要使用OnFocusChangeListener,然后检查屏幕处于触摸模式时是否发生了焦点事件:如果发生了,则是用户单击,否则来自轨迹球/触控板。


小智 5

您可以在onClick(View v)

.....
v.setFocusableInTouchMode(true);
v.requestFocus();
v.setFocusableInTouchMode(false);
.....//the others
Run Code Online (Sandbox Code Playgroud)

因此,v获得焦点,您可以onClick()通过进行操作setFocusableInTouchMode(false),它可以onClick在第一时间接受。