【问题标题】:Show AlertDialog using Sherlock with the Holo theme?使用带有 Holo 主题的 Sherlock 显示 AlertDialog?
【发布时间】:2013-03-17 16:36:40
【问题描述】:

在 Android 2.3.4 上使用 Sherlock: 我想显示一个 AlertDialog 包含:

1) 标题
2)内容
3)2 个按钮
我正在使用以下类:

public class MyAlertDialog extends SherlockDialogFragment{

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
          // Use the Builder class for convenient dialog construction

        AlertDialog.Builder builder = new AlertDialog.Builder(getSherlockActivity());
        builder.setMessage("Title")
               .setPositiveButton("Fire!", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // FIRE ZE MISSILES!
                   }
               })
               .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       // User cancelled the dialog
                   }
               });
        // Create the AlertDialog object and return it
        return builder.create();
    }

}

在我的 Activity 中,我正在调用:

MyAlertDialog m = new MyAlertDialog();
m.show(getSupportFragmentManager(), "hey");

它正在显示 AlertDialog 但主题是旧的(记住我使用的是 Android 2.3.4)

如果你愿意,这是我的整个主要活动课程:

public class MainActivity extends SherlockFragmentActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar ab;
        ab = getSupportActionBar();
        ab.setTitle("Testing Sherlock"); 

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        getSupportMenuInflater().inflate(R.menu.main, menu);

        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        switch(item.getItemId())
        {
        case R.id.action_one:
            MyAlertDialog m = new MyAlertDialog();
            m.show(getSupportFragmentManager(), "hey");
            break;
        }
        return super.onOptionsItemSelected(item);
    }
}

我为我的应用设置的样式是:

<resources>
<style name="AppBaseTheme" parent="@style/Theme.Sherlock.Light">
</resources>

P.S:我显示了ActionBar,除了AlertDialog 的主题外,一切正常。
我希望它看起来像这样:

不喜欢这个:

【问题讨论】:

  • 您是否也添加了HoloEverywhere 库?
  • 不...我应该添加它吗?
  • 这是在所有 API 版本上获取整个 Holo 主题的简单方法。
  • 我应该把它和sherlock一起加入吗?

标签: android actionbarsherlock


【解决方案1】:

创建样式:

<resources>
    <style name="MyFragment">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowTitleStyle">@null</item>
        <item name="android:colorBackground">#ffffff</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:textColor">#FF0000</item>
    </style>
</resources>

在您的 SherlockFragmentActivity 中:

public class MyDialogFragment extends SherlockDialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyFragment);
        // Get the layout inflater
        LayoutInflater inflater = getActivity().getLayoutInflater();
        final View view = inflater.inflate(R.layout.custom_layout, null);
        ....
    }
}

R.style.MyFragment 是样式。

R.style.custom_layout 是 AlertDialog 的自定义布局。

【讨论】:

  • 您用于构建器的 CTOR 仅可从 API11 获得。此外,即使您使用 AlertDialog.Builder(new ContextThemeWrapper(this, R.style.MyFragment)); ,它不会工作。在带有 android 2.3.5 的 Galaxy s2 上测试。
【解决方案2】:

这个库看起来很适合全息风格的 android 对话框 https://github.com/inmite/android-styled-dialogs

【讨论】:

    【解决方案3】:

    我已经这样做了,我不记得我采取的确切步骤,但一般的做法是:

    从以下位置复制 XML alert_dialog_holo(我认为是名称):
    android sdk 文件夹\platforms\android-version 使用 holo\data\res\layout
    到你的项目。

    我认为您必须进行一些更改才能使其正常工作(我不再知道我到底做了什么,但我相信要记住您必须从某些样式定义中删除“android:”前缀,然后它们将被 ABS 识别。

    也许您还需要从这个tool 生成的样式,但我不知道是否暗示它们可以使其工作。

    也看看这个question,相应的答案将引导你如何在你的对话框中膨胀你自己的 XML

    【讨论】:

    • 您需要对复制的 XML 进行一些更改,使其正常工作,然后您应该能够在 DialogFragment 中对 XML 进行膨胀
    • 这将是我的替代选择,因为我希望它与 Sherlock 一起工作。我不想让自己的新“夏洛克”课..哈哈
    • 您不需要创建自定义类,只需使用您的 AlertDialog 类并扩展自定义布局而不是 androids 标准布局
    • 看我回答的最后一句话我已经更新了,链接会提示你如何膨胀你的布局
    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多