当前位置: 首页 > 知识库问答 >
问题:

禁用无边框按钮时如何显示不同的布局?

易宏阔
2023-03-14

我正在将无边框按钮的概念应用到我正在开发的应用程序中。我可以编辑我的按钮完美到目前为止与以下问题的帮助:

如何创建标准的无边框按钮(如设计指南中提到的)?

Android绘图分隔符/分隔符线布局?

但是现在我需要显示一个不同的背景图像,或者当按钮由于用户没有填写某些必填字段而未启用时需要强调的内容。

到目前为止,我的代码是:

<RelativeLayout
    android:id="@+id/layoutId"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >

    <View
        android:layout_width="match_parent"
        android:layout_height="1dip"
        android:layout_marginLeft="4dip"
        android:layout_marginRight="4dip"
        android:background="@android:color/darker_gray"/>

    <Button
        android:id="@+id/buttonId"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:background="?android:attr/selectableItemBackground"
        android:onClick="onButtonClicked"
        android:text="@string/someText"
        android:textColor="@color/someColor"
        android:textSize="25sp"
        android:textStyle="bold" />

</RelativeLayout>

现在,我打算在按钮的背景中放置一个带条纹的图像,以显示它何时被禁用。通过阅读下面的问题,我可以定制我的按钮,当它不是无边界的。

不同颜色的标准Android按钮

我试图用这个想法来定制我的无边框按钮,就像下面的代码一样:

<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_enabled="true" 
        android:drawable="?android:attr/selectableItemBackground" >
    </item>

    <item android:state_enabled="false"
        android:drawable="@drawable/stripes"
        android:tileMode="repeat" >
    </item>
</selector>

但似乎不可能,一旦<代码>?android: attr/selectableItembackground中的borderless_button_bg.xml使程序崩溃。

05-28 17:44:54.139: W/dalvikvm(31664): threadid=1: thread exiting with uncaught exception (group=0x40bc61f8)
05-28 17:44:54.154: E/AndroidRuntime(31664): FATAL EXCEPTION: main
05-28 17:44:54.154: E/AndroidRuntime(31664): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Company.productname/com.Company.productname.myActivity}: android.view.InflateException: Binary XML file line #310: Error inflating class <unknown>
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.app.ActivityThread.access$600(ActivityThread.java:128)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.os.Looper.loop(Looper.java:137)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.app.ActivityThread.main(ActivityThread.java:4514)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at java.lang.reflect.Method.invokeNative(Native Method)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at java.lang.reflect.Method.invoke(Method.java:511)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at dalvik.system.NativeStart.main(Native Method)
05-28 17:44:54.154: E/AndroidRuntime(31664): Caused by: android.view.InflateException: Binary XML file line #310: Error inflating class <unknown>
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.view.LayoutInflater.createView(LayoutInflater.java:606)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:653)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:273)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.app.Activity.setContentView(Activity.java:1835)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at com.Company.productname.myActivity.onCreate(TelaCaminhao.java:41)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.app.Activity.performCreate(Activity.java:4465)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
05-28 17:44:54.154: E/AndroidRuntime(31664):    ... 11 more
05-28 17:44:54.154: E/AndroidRuntime(31664): Caused by: java.lang.reflect.InvocationTargetException
05-28 17:44:54.154: E/AndroidRuntime(31664):    at java.lang.reflect.Constructor.constructNative(Native Method)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.view.LayoutInflater.createView(LayoutInflater.java:586)
05-28 17:44:54.154: E/AndroidRuntime(31664):    ... 25 more
05-28 17:44:54.154: E/AndroidRuntime(31664): Caused by: android.content.res.Resources$NotFoundException: File res/drawable-ldpi/borderless_button_bg.xml from drawable resource ID #0x7f020000
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.content.res.Resources.loadDrawable(Resources.java:1958)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.view.View.<init>(View.java:2832)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.widget.TextView.<init>(TextView.java:558)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.widget.Button.<init>(Button.java:108)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.widget.Button.<init>(Button.java:104)
05-28 17:44:54.154: E/AndroidRuntime(31664):    ... 28 more
05-28 17:44:54.154: E/AndroidRuntime(31664): Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #7: <item> tag requires a 'drawable' attribute or child tag defining a drawable
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:178)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:867)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.graphics.drawable.Drawable.createFromXml(Drawable.java:804)
05-28 17:44:54.154: E/AndroidRuntime(31664):    at android.content.res.Resources.loadDrawable(Resources.java:1955)
05-28 17:44:54.154: E/AndroidRuntime(31664):    ... 33 more

所以,我的问题是:我需要使用无边框按钮,我需要明确按钮何时被禁用。我有什么选择?

共有1个答案

许毅
2023-03-14

这就是我解决问题的方法:

public class MyScreen extends Activity {
    private Button btnNext;
    private Drawable background;

    btnNext = (Button) this.findViewById(R.id.btnNext);
    background = btnNext.getBackground(); //stores the original Drawable characteristic

    ...

    //disable button
    if (!canGoNext) {
        btnNext.setEnabled(false);
        btnNext.setBackgroundResource(R.drawable.gray); //make it gray
    }
    //enable button
    else {
        btnNext.setEnabled(true);
        btnNext.setBackgroundDrawable(background); //make it selectableItemBackground again
    }
}
 类似资料:
  • 我有一个弹出窗口,里面有一个输入。弹出窗口的创建如下所示: 这一切都很有效,可以通过输入。当用户点击android手机上的后退按钮时,问题就出现了。后退按钮关闭弹出窗口。这不应该发生,因为用户的意图是在与弹出窗口进行交互之前无法继续。 现在,我们当然可以将弹出视图的焦点设置为,以禁止通过后退按钮解除:

  • 我想禁用按钮,直到文本框中有文本。我怎么做?我是初学者,我什么都不知道,所以我应该添加一个代码就好了。我的代码: 私有无效按钮1\u单击(对象发送者,事件参数e){

  • 我(目前)有三个按钮 使用这些按钮,我想显示不同的菜单/覆盖。覆盖图如下所示: 这方面的JS是: 我的问题是只有菜单1正在显示。脚本可以正常工作,但是menu2和menu3没有显示。 我想这一定是缺少的东西。也许是a$(this)什么的(对不起我的JS已经不是以前的样子了)。我在中循环,然后从google chrome dev中点击了“Right”按钮(我想,很难说出来)。 预期结果:如果我按下按

  • 在Xamarin中,我目前有两个不同的活动,我想将它们组合在一起并使用一个视页。 一个活动使用以下内容视图: 第二个活动使用以下内容视图: 提前致谢

  • 我有以下问题:我有沙箱中的代码,我想显示一个按钮,如果复选框被选中,最大数量大于1。最大数量条件不是问题,而是复选框的问题。我不知道如何获得特定复选框的“选中”值。我认为我不能对索引做任何事情,因为索引值在映射optionModules时被多次使用。预先感谢你的帮助。沙盒链接:https://codesandbox.io/s/nostalgic-germain-e18wh

  • 此表单在基于函数的视图中显示单选按钮,但在我引入基于类的视图时更改为复选框,有什么解决办法。我希望他们再次显示单选按钮 表单.py models.py 模板 views.py