【问题标题】:How can I keep a button as pressed after clicking on it? [duplicate]点击按钮后如何保持按下状态? [复制]
【发布时间】:2011-01-20 12:50:16
【问题描述】:

可能重复:
Android. How do I keep a button displayed as PRESSED until the action created by that button is finished?

我有一个按钮,当我按下它时,我希望它保持按下状态(Froyo 上为绿色)。

有什么帮助吗?

mycodes_Button = (Button) findViewById(R.id.mycodes);
...
if (saved_Button.isPressed())
{
    saved_Button.setFocusable(true);
}

这样的?

【问题讨论】:

  • 你能告诉我这段代码遇到了什么问题吗?
  • 当我点击按钮后,它不会保持按下状态(我的意思是绿色),它会返回到原来的状态,灰色。

标签: android button pressed


【解决方案1】:

我在使用自定义背景的按钮时遇到了这个问题,最终为此使用了selected state。该状态适用于所有视图。

要使用它,您必须将自定义按钮背景定义为 state list:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_selected="false" android:state_focused="false" 
     android:state_pressed="false"><bitmap ... /></item>
  <item android:state_selected="true"><bitmap ... /></item>
  <item android:state_focused="true"><bitmap ... /></item>
  <item android:state_pressed="true"><bitmap ... /></item>
</selector>

然后使用那个背景,假设它在你的布局文件中的/res/drawable/button_bg.xml,你使用:

...
<Button android:background="@drawable/button_bg" ... />
...

在您的代码中,您可以在 onClick 侦听器中切换到(取消)选中状态:

myButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    v.setSelected(true);
    // normal click action here
  }
});

activated state 更符合预期含义,但仅适用于 Android 3.x 及更高版本。

【讨论】:

  • isActivated() 方法仅适用于 API 级别 11 及更高级别。出于与旧 android OS 版本的可比性原因,我不建议使用它。 API 级别 11 相当于 android 3.x,没有人在他们的手机上使用。
  • @phlipp 是对的,我在测试中注意到这一点(输入此答案后)并切换到选中,但忘记更新我的答案。
  • 谢谢 beetstra。我注意到pressed 解决方案存在缺陷,所以我使用了您的解决方案。到目前为止更简单、完美。
【解决方案2】:

使用以下代码。很有用。

mycodes_Button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        mycodes_Button.setPressed(true);
        return true;
    }
});

【讨论】:

  • 这基本上是可行的,但你应该提到,你失去了正常的按钮功能。因为您在这里返回true,所以永远不会执行onClick 的东西。所以实际上你必须触发这些东西,你希望按钮在这个onTouch 方法中执行。顺便说一句:你应该使用v.setPressed(true)。
  • 现在不需要单独处理onClick 的东西。只需在onTouch 中使用v.performClick();
  • 这个有点问题。我认为当活动暂停时,按钮不会被按下。这对我来说很遗憾,因为我显示了一个进度对话框,还导航到其他活动,并希望在这些情况下保持按下按钮。
【解决方案3】:

ToggleButton 是否适合您的需求?

从您的 cmets 看来,您似乎不知道Touch Mode。在这种模式下,这是大多数事情的默认模式,没有焦点(这是您想要实现的)和没有选择的项目。

您可以尝试以编程方式退出触摸模式,但我不建议这样做。使用一段时间后,触控模式会给用户带来更好的体验。

【讨论】:

  • 当我点击按钮后,它不会保持按下状态(我的意思是绿色),它返回到原来的状态,灰色的。我需要普通按钮而不是 ToggleButton.. 感谢您的回答!
  • 实际上我需要普通按钮 kostas.. 感谢您的回复(ευχαριστώ για την απάντηση!)
  • 普通按钮不能保持按下状态 - 它只能保持焦点状态。
  • 嗯,我认为这是同一件事......我的意思是这就是我想要的......我想要按下一个按钮然后保持按下或聚焦
  • 你可能不知道触控模式。请参阅我编辑的答案。
猜你喜欢
  • 2017-12-25
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多