如何给片段一个对话框的外观?

时间:2014-08-15 12:23:19

标签: android android-layout android-fragments

我有一款目前市场上的Android游戏,如果实施基于回合制的多人游戏模式,我正在进行中。不幸的是,游戏中使用了大量独特的活动,Google Play游戏服务要求游戏使用片段在单个活动中工作。出于这个原因,我将项目转换为这样的系统(使用android-support-v4)。

我已经编写了一个抽象层来帮助这个过程,并且由于游戏已经在当前状态下进行了全面测试,我希望避免重大改写,将其从多个活动更改为多个片段。游戏运行正常,但我对某些片段的出现有困难。

我面临的主要问题是显示从 android:Theme.Dialog 继承的活动。我有许多活动显示在浮动的对话框式框中,但这些是活动而不是对话框。在原始代码中,我在styles.xml中定义了以下内容 -

<style name="MyDialogStyle" parent="android:Theme.Dialog">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@drawable/my_border_graphic</item>
    <item name="android:textSize">18sp</item>
    <item name="android:windowAnimationStyle">@style/MyDialogAnimations</item>
</style>

使用此布局的活动在清单中定义为 -

<activity
    android:name="com.package.name.myactivity"
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:screenOrientation="landscape"
    android:theme="@style/MyDialogStyle" >
</activity>

启动此活动会产生与样式xml完全相同的对话框样式显示。到目前为止,我无法为新代码中的任何片段重新创建此样式。我试过使用如下风格 -

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.MyDialogStyle);
    LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);
    final View v = localInflater.inflate(R.layout.my_layout, container, false);
    ...

但结果片段出现在屏幕的左上角。此外,如果它包含非常长的文本,则片段版本使用全屏宽度,而活动包含在短行中。

显然,我可以使用重力设置来更集中地显示内容,但我不知道为什么我无法像使用Activity一样使用样式来控制这些因素。

是否可以在对话框样式浮动框中显示片段?如果是这样,我需要做出哪些改变?我知道我可以通过使用DialogFragment实现所需的外观,在onCreate中调用setStyle并使用show(...)显示它但我想将它保留为标准片段,以便它使用相同(或更相似)的生活方式到上一个活动方法。

[我现在意识到我不会在对话框的托管片段中获得相同的onPause / onResume生命周期事件 - 添加对话框片段而不是替换当前片段,所以他们不会被称为

这是我设置的用于播放片段代码的小型测试平台 -

MainActivity.java

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportFragmentManager().beginTransaction().add(R.id.container, new TestFragment()).addToBackStack(null).commit();
    }

    public static class TestFragment extends DialogFragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.MyDialog);
            LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);
            final View v = localInflater.inflate(R.layout.test_dialog, container, false);
            return v;
        }
    }
}

activity_main.xml中

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</FrameLayout>

test_dialog.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST! TEST!" />
</RelativeLayout>

styles.xml

<resources>
    <style name="MyDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowNoTitle">true</item>
    </style>
</resources>

这是结果输出(看起来不像对话框) -

Screenshot

非常感谢任何建议。

2 个答案:

答案 0 :(得分:1)

使用对话框片段。它的工作原理与片段完全相同,在显示时看起来像一个对话框。

答案 1 :(得分:0)

这就是我为自己解决这个问题的方法,有一个自定义View我希望以对话框样式漂浮在其他人之上:

  1. 将我的自定义布局的根视图的背景设置为 android:background="?android:attr/windowBackground"
  2. 然后,使用自定义对话框主题(例如new ContextThemeWrapper(getActivity(), R.style.MyDialogStyle)
  3. )对视图进行充气

    然后,您获得一个膨胀的视图层次结构,其根的背景类似于对话框窗口。

    请注意,这不会像对话框一样阻碍屏幕的其余部分,只是在片段周围显示一个框架。