【问题标题】:OnKeyListener in Android not firing an event (Volume key) inside FragmentAndroid中的OnKeyListener没有触发片段内的事件(音量键)
【发布时间】:2017-12-17 02:34:33
【问题描述】:

我在片段中有一个 Android 应用程序,我正在尝试获取按下音量键的事件,但该事件没有触发。

我尝试在 onKey() 方法处设置断点,但它从未到过那里。

代码如下:-

import android.view.View.OnKeyListener;
 public class ExampleFragment extends Fragment implements OnKeyListener {
     @Override
     public boolean onKey(View v, int keyCode, KeyEvent event) {
         if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)){
             //to do code goes in here
             return true;
         }
         return false;
     }
}

【问题讨论】:

  • 你没有绑定任何东西
  • 可以绑定Button吗?

标签: android android-fragments keylistener


【解决方案1】:

您尚未将 Fragment 设置为 KeyListener 任何内容。需要有一个View 注册才能提交KeyEvents。

在您的 Fragment 中,尝试以下操作:

@Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    // Create an EditText we want to Listen to.
    EditText e = new EditText(getActivity());
    // Assert this Fragment was the KeyListener.
    e.setOnKeyListener(this);
    // Return the View.         
    return e;
}

在理想的世界中,Button 不应该负责收听 KeyEvents。它应该只处理点击和按下,因为这就是 Button 在现实世界中的行为方式。一般来说,您应该避免提供任何类型的图形对象应用程序特定的知识,应该由应用程序决定做什么,并相应地更新 UI。

这种架构通常以Model View Controller 的形式出现。

相反,您可能想尝试在Fragment 的拥有Activity 中覆盖onKeyDown,并将其路由到Fragment 中的相应方法。

看到这个example

【讨论】:

  • OnKeyListener 可以应用于 any View
  • ` startButton.setOnkeyListener(this)` 我在代码中添加了,但它仍然没有为我捕获事件。
  • 类似于startButton.setOnKeyListener(this);小心大写。如果此答案对您有所帮助,请考虑将问题标记为已回答。 :-)
  • 能否也告诉我,如果我将它绑定到一个按钮,它会调用 Button 的 on click 函数吗?
  • 是的,如果你这样编程的话。 ;)
【解决方案2】:

我遇到了同样的问题。就我而言, onKeyListener 在一个 Fragment 中有效,但在另一个 Fragment 中无效。我发现这取决于键盘的类型。 我已经设置了 EditText inputType="text" 并开始工作。这是一个奇迹。我真的无法理解发生了什么。在我的情况下,问题出现在华为,genymotion 没有出现错误。

   <EditText
    android:id="@+id/answer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:inputType="text"
    />

【讨论】:

  • 我使用了虚拟键盘输入类型,虽然我的编辑文本输入属性没有设置。我不得不通过覆盖一个方法来处理两个不同片段的接口来破解它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
相关资源
最近更新 更多