草庐IT

android - 替换Android DialogFragment的按钮背景

coder 2023-12-12 原文

所以我之前在另一个线程的帮助下解决了这个问题,但是由于我的应用程序发生了一些新变化,以前的解决方案不再有效。这是上一个线程:Android App: Replace default button background with custom background in a Dialog Fragment

我正在尝试为自定义 DialogFragment 的正/负按钮的背景可绘制对象设置样式,但似乎无法进行任何更改。最初,我使用了以下内容:

@Override
public void onStart() {
    super.onStart();
    Button pButton =  ((AlertDialog) getDialog()).getButton(DialogInterface.BUTTON_POSITIVE);
    Button nButton =  ((AlertDialog) getDialog()).getButton(DialogInterface.BUTTON_NEGATIVE);

    pButton.setBackground(getResources().getDrawable(R.drawable.button_custom));
    nButton.setBackground(getResources().getDrawable(R.drawable.button_custom));
}

这很好用,完全符合我的要求。但是,我认为这停止工作了,因为我最近添加了一个由 Android Action Bar 样式生成器创建的样式,在这里可以找到:http://jgilfelt.github.io/android-actionbarstylegenerator

我已经尝试将我的样式添加到操作栏样式生成器生成的样式文件中,但这不起作用。这是我尝试添加的内容:

<style name="ButtonLegacyButton" parent="android:Widget.Holo.Light.Button">
  <item name="android:background">@drawable/legacybutton_btn_default_holo_light</item>
</style>

<style name="ImageButtonLegacyButton" parent="android:Widget.Holo.Light.ImageButton">
  <item name="android:background">@drawable/legacybutton_btn_default_holo_light</item>
</style>

这些是我用 http://android-holo-colors.com/ 生成的新绘图

我在 onStart 方法中尝试的编程技巧似乎也没有让任何东西“粘”在按钮上。

我在这里找到了这个博客:http://android.codeandmagic.org/why-android-dialogfragment-confuses-me-part1/#comment-28043准确地描述了我的问题,只是它们走向了不同的方向并且从不回答我遇到的问题。

有什么想法可以尝试吗?

编辑: 我还有一个未使用的 styles.xml。这是请求的其余文件。

这是我的 Android list :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.legacy"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/legacy_icon"
        android:label="@string/app_name"
        android:theme="@style/Theme.Legacylogo">
        <activity
            android:name="com.example.legacy.GameListActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        ... other activities
    </application>

</manifest>

这是我的整个 styles_legacylogo.xml:

<resources>

    <style name="Theme.Legacylogo" parent="@style/Theme.AppCompat.Light">
        <item name="android:actionBarItemBackground">@drawable/selectable_background_legacylogo</item>
        <item name="android:popupMenuStyle">@style/PopupMenu.Legacylogo</item>
        <item name="android:dropDownListViewStyle">@style/DropDownListView.Legacylogo</item>
        <item name="android:actionBarTabStyle">@style/ActionBarTabStyle.Legacylogo</item>
        <item name="android:actionDropDownStyle">@style/DropDownNav.Legacylogo</item>
        <item name="android:actionBarStyle">@style/ActionBar.Transparent.Legacylogo</item>
        <item name="android:actionModeBackground">@drawable/cab_background_top_legacylogo</item>
        <item name="android:actionModeSplitBackground">@drawable/cab_background_bottom_legacylogo</item>
        <item name="android:actionModeCloseButtonStyle">@style/ActionButton.CloseMode.Legacylogo</item>
        <item name="android:spinnerItemStyle">@style/SpinnerItem</item>
        <item name="android:spinnerDropDownItemStyle">@style/SpinnerItem.DropDownItem</item>
    </style>

    <style name="ActionBar.Solid.Legacylogo" parent="@android:style/Widget.Holo.ActionBar.Solid">
        <item name="android:background">@drawable/ab_solid_legacylogo</item>
        <item name="android:backgroundStacked">@drawable/ab_stacked_solid_legacylogo</item>
        <item name="android:backgroundSplit">@drawable/ab_bottom_solid_legacylogo</item>
        <item name="android:progressBarStyle">@style/ProgressBar.Legacylogo</item>
    </style>

    <style name="ActionBar.Transparent.Legacylogo" parent="@android:style/Widget.Holo.ActionBar">
        <item name="android:background">@drawable/ab_transparent_legacylogo</item>
        <item name="android:progressBarStyle">@style/ProgressBar.Legacylogo</item>
    </style>

    <style name="PopupMenu.Legacylogo" parent="@android:style/Widget.Holo.ListPopupWindow">
        <item name="android:popupBackground">@drawable/menu_dropdown_panel_legacylogo</item>    
    </style>

    <style name="DropDownListView.Legacylogo" parent="@android:style/Widget.Holo.ListView.DropDown">
        <item name="android:listSelector">@drawable/selectable_background_legacylogo</item>
    </style>

    <style name="ActionBarTabStyle.Legacylogo" parent="@android:style/Widget.Holo.ActionBar.TabView">
        <item name="android:background">@drawable/tab_indicator_ab_legacylogo</item>
    </style>

    <style name="DropDownNav.Legacylogo" parent="@android:style/Widget.Holo.Spinner">
        <item name="android:background">@drawable/spinner_background_ab_legacylogo</item>
        <item name="android:popupBackground">@drawable/menu_dropdown_panel_legacylogo</item>
        <item name="android:dropDownSelector">@drawable/selectable_background_legacylogo</item>
    </style>

    <style name="ProgressBar.Legacylogo" parent="@android:style/Widget.Holo.ProgressBar.Horizontal">
        <item name="android:progressDrawable">@drawable/progress_horizontal_legacylogo</item>
    </style>

    <style name="ActionButton.CloseMode.Legacylogo" parent="@android:style/Widget.Holo.ActionButton.CloseMode">
        <item name="android:background">@drawable/btn_cab_done_legacylogo</item>
    </style>

    <style name="SpinnerItem" parent="@android:style/Widget.TextView.SpinnerItem">
        <item name="android:textColor">#fef7e7</item>
    </style>

    <style name="SpinnerItem.DropDownItem" parent="@android:style/Widget.DropDownItem.Spinner">
        <item name="android:textColor">#fef7e7</item>
    </style>

    <style name="ButtonLegacyButton" parent="android:Widget.Holo.Light.Button">
      <item name="android:background">@drawable/legacybutton_btn_default_holo_light</item>
    </style>

    <style name="ImageButtonLegacyButton" parent="android:Widget.Holo.Light.ImageButton">
      <item name="android:background">@drawable/legacybutton_btn_default_holo_light</item>
    </style>

    <!-- this style is only referenced in a Light.DarkActionBar based theme -->
    <style name="Theme.Legacylogo.Widget" parent="@android:style/Theme.Holo">
        <item name="android:popupMenuStyle">@style/PopupMenu.Legacylogo</item>
        <item name="android:dropDownListViewStyle">@style/DropDownListView.Legacylogo</item>
    </style>

</resources>

最佳答案

设置默认 AlertDialog 的样式非常棘手,并且没有得到真正的支持,尽管有一些小警告,但说这是可能的。

在您的 style.xml 中为对话框添加自定义主题条目:

<style name="CustomTheme.Dialog" parent="android:Theme.Holo.Light.Dialog">
    <item name="android:buttonBarButtonStyle">@style/CustomTheme.Dialog.Button</item>
    <!-- See caveat -->
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>

然后为按钮本身添加样式:

<style name="CustomTheme.Dialog.Button" parent="@android:style/Widget.Holo.Light.Button.Borderless.Small">
    <item name="android:background">@drawable/legacybutton_btn_default_holo_light</item>
</style>

在您创建构建器的 fragment 扩展中,将对客户主题的引用传递给它:

builder = new AlertDialog.Builder(getActivity(), R.style.CustomTheme_Dialog);

基本上就是这样。

注意事项: AlertDialog 的样式和主题不是公开的,因此不能用作新主题的父条目。为了“正确地”扩展它,您必须复制 Dialog 和 AlertDialog 样式之间的差异。这确实不是一个大问题,但您应该意识到,如果不进行干预,平台样式中专门涉及 AlertDialog 的更改可能不会完全过渡到您的应用程序;只是要记住一些事情。

不幸的是,为了真正了解它是如何工作的,您确实需要深入挖掘 Android 源代码并查看所有文件的应用方式。 https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/AlertDialog.java https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/layout/alert_dialog_holo.xml https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/attrs.xml https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/styles.xml https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/themes.xml

跟踪通常会从布局开始,然后根据属性、样式或主题进行跟踪。

我会坦率地承认,一旦我想出了如何做到这一点......去年的某个时候,我停止了挖掘,所以我无法完全解释为什么不允许在创建后修改 DialogFragment 的样式,但引用文档可以在传入 setStyle 方法条目时提及它。奇怪的是,在调用 onCreate 之后,这些样式似乎是不可变的。

如果您想扩展任何内容,请告诉我。

关于android - 替换Android DialogFragment的按钮背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24691192/

有关android - 替换Android DialogFragment的按钮背景的更多相关文章

  1. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  2. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  3. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  4. ruby-on-rails - 使用 Rmagick 或 ImageMagick 在背景上放置标题 - 2

    我有一张背景图片,我想在其中添加一个文本框。我想弄清楚如何将标题放置在其顶部的正确位置。(我使用标题是因为我需要自动换行功能)。现在,我只能让文本显示在左上角,但我需要能够手动定位它的开始位置。require'RMagick'require'Pry'includeMagicktext="Loremipsumdolorsitamet"img=ImageList.new('template001.jpg')img 最佳答案 这是使用convert的ImageMagick命令行的答案。如果你想在Rmagick中使用这个方法,你必须自己移植

  5. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  6. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  7. ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象 - 2

    假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl

  8. ruby - 如何搜索、递增和替换 Ruby 字符串中的整数子字符串? - 2

    我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/

  9. ruby - 改变替换的大小写 - 2

    我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}

  10. ruby-on-rails - Rails 单选按钮 - 模型中多列的一种选择 - 2

    我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模

随机推荐