【问题标题】:Styling DialogFragment dialog pre ice cream sandwich造型 DialogFragment 对话框前冰淇淋三明治
【发布时间】:2013-09-22 14:40:25
【问题描述】:

我正在尝试设置 FragmentDialog pre 4.0 的样式,使其显示为 post 4.0。

我使用的是ActionBarSherlock,但我必须自己在冰淇淋三明治之前为其设计样式。

我想得到以下外观:

但我明白了:

所以基本上我不希望它填满整个屏幕。

我尝试了各种造型,但都没有成功,我已经到了希望有专家可以帮助我或指导我正确方向的地步

我的 DialogFragment:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //TODO Style 2.3 to look like 4.0
        int sdk = android.os.Build.VERSION.SDK_INT;
        if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
            setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Pre_Honeycomb_Holo_Dialog);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = null;
        int sdk = android.os.Build.VERSION.SDK_INT;
        if(sdk < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            view = inflater.inflate(R.layout.info_dialog_view, container);
        } else {
            view = inflater.inflate(R.layout.info_dialog_view_content, container);
            this.getDialog().setTitle(R.string.info_dialog_title);
        }
...

基本上我是在 Ice Cream Sandwich 之前构建标题布局,但内容区域是相同的。

我的 holo_dialog_style:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="Pre.Honeycomb.Holo.Dialog" parent="Theme.Sherlock.Light">
        <item name="android:windowTitleStyle">@null</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:windowBackground">@drawable/panel_bg_holo_light</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    </style>
</resources>

【问题讨论】:

    标签: android android-dialogfragment


    【解决方案1】:

    这是图书馆成为您朋友的众多案例之一!

    我建议使用Styled Dialogs for Android

    它能够生成如下所示的对话框:

    要使用它,您需要先将它添加到 Maven(如果您正在使用它):

    <dependency>
        <groupId>eu.inmite.android.lib</groupId>
        <artifactId>android-styled-dialogs</artifactId>
        <version>1.0.1</version>
        <type>apklib</type>
    </dependency>
    

    或者如果您使用的是 Ant,那么您可能只想下载 latest jar

    现在,您只需设置您的主题以使用您想要的主题。将以下内容添加到您的应用程序主题中:

    全息灯

    <item name="sdlDialogStyle">@style/DialogStyleLight.Custom</item>
    

    全息黑暗

    <item name="sdlDialogStyle">@style/DialogStyleDark.Custom</item>
    

    您还可以添加以下样式,以便您根据需要进行自定义:

    <style name="DialogStyleLight.Custom">
        <!-- anything can be left out: -->
        <item name="titleTextColor">@color/dialog_title_text</item>
        <item name="titleSeparatorColor">@color/dialog_title_separator</item>
        <item name="messageTextColor">@color/dialog_message_text</item>
        <item name="buttonTextColor">@color/dialog_button_text</item>
        <item name="buttonSeparatorColor">@color/dialog_button_separator</item>
        <item name="buttonBackgroundColorNormal">@color/dialog_button_normal</item>
        <item name="buttonBackgroundColorPressed">@color/dialog_button_pressed</item>
        <item name="buttonBackgroundColorFocused">@color/dialog_button_focused</item>
        <item name="dialogBackground">@drawable/dialog_background</item>
    </style>
    

    一旦你有了它,它就很容易使用:

    带有简单消息和关闭按钮的对话框

    SimpleDialogFragment.createBuilder(this, getSupportFragmentManager()).setMessage(R.string.message).show();
    

    带有标题、消息和关闭按钮的对话框

    SimpleDialogFragment.createBuilder(this, getSupportFragmentManager()).setTitle(R.string.title).setMessage(R.string.message).show();
    

    带有标题、消息和两个按钮的对话框

    SimpleDialogFragment.createBuilder(this, getSupportFragmentManager()).setTitle(R.string.title).setMessage(R.string.message).setPositiveButtonText(R.string.positive_button).setNegativeButtonText(R.string.negative_button).show();
    

    对于其他示例,还有一对demos 可用。

    【讨论】:

    • 这解决了问题,但我必须包含一个库才能使其工作,HoloEverywhere 库也可以完成这项工作。我奖励了你在答案中付出的思考和努力,但我还没有决定是否要采取这个方向。
    • 我肯定会建议使用该库。图书馆是你的朋友!此外,这样做有助于确保所有可用 Android 设备 (2.2+) 的 UI 一致。
    • @timonvlad 这不是 Dialogs 在 Android 中正常工作的方式。我建议在整体上保持与 Android 相似的外观和感觉,并简单地使用 Text。图标本身不是不言自明的,而文字可以很清楚。
    • @David,你是对的文字...但是我的两个按钮只是“ok”或“not”...所以,两个小图标就足够了...。我可以用drawable改变正负按钮?
    • @timonvlad 是的,这是图书馆允许你做的事情。查看自定义对话框的JayneHatDialogFragment 示例。只需将相同的概念应用于您的按钮。
    【解决方案2】:

    为避免填满整个屏幕,您可以在 DialogFragment 的 onStart 方法上使用此代码:

    @Override
    public void onStart() {
        super.onStart();
    
        // safety check
        if (getDialog() == null)
            return;
    
        getDialog().getWindow().setLayout(width, height);
    
    }
    

    getDialog().getWindow().setLayout(width, height); 方法中以编程方式设置所需的宽度和高度。

    然后在您正在膨胀的 xml 布局文件 (R.layout.info_dialog_view) 中设置宽度和高度以匹配父级。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 2014-03-26
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多