我有一款目前市场上的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>
这是结果输出(看起来不像对话框) -
非常感谢任何建议。
答案 0 :(得分:1)
使用对话框片段。它的工作原理与片段完全相同,在显示时看起来像一个对话框。
答案 1 :(得分:0)
这就是我为自己解决这个问题的方法,有一个自定义View
我希望以对话框样式漂浮在其他人之上:
android:background="?android:attr/windowBackground"
new ContextThemeWrapper(getActivity(), R.style.MyDialogStyle)
然后,您获得一个膨胀的视图层次结构,其根的背景类似于对话框窗口。
请注意,这不会像对话框一样阻碍屏幕的其余部分,只是在片段周围显示一个框架。