Android:如何在运行时启用/禁用按钮?

8

好的,我有两个按钮。第一个是“加载文本”,第二个是“朗读”。

现在,如果没有加载文本,我不希望“朗读”按钮处于活动状态。

我已经通过“加载文本”按钮的onClickListener方法将值设置到EditText中。在同一个方法内,我调用了:

btnSpeak.setEnabled(true);

我已将其初始化为:
btnSpeak = (Button) findViewById(R.id.button1);

整个的编码如下:
@Override
public void onInit(int status) {

    if (status == TextToSpeech.SUCCESS) {

        int result = tts.setLanguage(Locale.US);

        if (result == TextToSpeech.LANG_MISSING_DATA
        || result == TextToSpeech.LANG_NOT_SUPPORTED) {
            Log.e("TTS", "This Language is not supported");
        } else {
            btnSpeak.setEnabled(true);
            //for checking
            if(btnSpeak.isEnabled())
            {
                Toast.makeText(SimpleAndroidOCRActivity.this, "Button should work!", Toast.LENGTH_SHORT).show();
            }
            else
            {
                Toast.makeText(SimpleAndroidOCRActivity.this, "Button should not work!", Toast.LENGTH_SHORT).show();
            }
        }

    } else {
        Log.e("TTS", "Initilization Failed!");
    }

}

这是检查TTS状态并为进一步使用分配语言的方法。我得到了“按钮应该工作”的提示,但它没有启用。为什么会这样?有什么解决方法吗?
在我的.xml文件中,如下所示:
<Button
    android:id="@+id/button1"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_width="200dp"
    android:enabled="false"
    android:text="@string/tts_text" />

我需要在运行时启用它吗?还是应该在此处启用,然后禁用并再次启用?

请检查您是否使用正确的ID初始化了按钮。 - stinepike
是的,我有正确的ID。 - iMan
6个回答

13
@Override
public void onInit(int status) {

    if (status == TextToSpeech.SUCCESS) {

        int result = tts.setLanguage(Locale.US);

        if (result == TextToSpeech.LANG_MISSING_DATA
        || result == TextToSpeech.LANG_NOT_SUPPORTED) {
            Log.e("TTS", "This Language is not supported");
        } else {
            btnSpeak.setEnabled(true);
            //for checking
            if(btnSpeak.isEnabled())
            {
                btnSpeak.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View view) {
                        YourVoicemethod();

                        Toast.makeText(SimpleAndroidOCRActivity.this, "Button should work!", Toast.LENGTH_SHORT).show();
                    }


                });
            }
            else
            {
                Toast.makeText(SimpleAndroidOCRActivity.this, "Button should not work!", Toast.LENGTH_SHORT).show();
            }
        }

    } else {
        Log.e("TTS", "Initilization Failed!");
    }

}

这也不起作用。如果我把所有这些都去掉,让两个按钮都启用,当我点击第二个按钮时,为什么我听不到声音呢? - iMan
按钮的onclick方法在哪里? - MR. Kumar

9

您需要使用setClickable方法。

btnSpeak.setClickable(true);
btnSpeak.setEnabled(true);

此外,使用isEnabled()来检查状态。
//for checking
if(btnSpeak.isEnabled())
{
  Toast.makeText(SimpleAndroidOCRActivity.this, "Button should work!", Toast.LENGTH_SHORT).show();
}
else
{
  Toast.makeText(SimpleAndroidOCRActivity.this, "Button should not work!", Toast.LENGTH_SHORT).show();
}

抱歉,我在这里使用了isEnabled,在检查时犯了一个错误。不过我会尝试使用clickable。 - iMan
1
使用 setFocusable(true) 和 setFocusableInTouchMode(true)。 - Linga
是的!这是正确的答案(必须处理可点击和启用事件)。谢谢@ling.s - caligari

5

检查您的按钮是否按下并编写您的代码。

示例代码。

if(button2.isPressed()){
    button2.setEnabled(false);
    button1.setEnabled(true);
}
else if(button1.isPressed()){
    button1.setEnabled(false);
    button2.setEnabled(true);
}

我希望这能对您有所帮助。


3
也许现在回答有点晚了,你可能已经找到解决方案了,但是您可以使用invalidate来强制按钮根据其新状态重新绘制自己:
btnSpeak.setEnabled(true);
btnSpeak.invalidate();

1
你可以通过禁用和启用按钮的可见性来实现。
以下是一个示例。
View button = findViewById(R.id.buttonid);
button.setVisibility(View.GONE);

谢谢,这个可行。虽然我仍然想知道为什么在运行时Enabled不起作用,如果我找不到任何可能的解决方案,我会选择你的答案。再次感谢你。 - iMan

0

为两个按钮使用一个监听器

button1.setOnClickListener(listener);
button2.setOnClickListener(listener);

listener = new OnClickListener({
    @Override
    public void onClick(View v) {
        switch(button_id){
            case id1:
            button2.setEnabled(false);
            button1.setEnabled(true);
            break;
            case id2:
            button1.setEnabled(false);
            button2.setEnabled(true);
            break;
        }
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接