【发布时间】:2015-04-10 15:41:14
【问题描述】:
我正在处理我的第一个 Android 应用程序,我现在有点迷茫。
我有一个 ListView,当用户点击这个列表中的一个元素时,应该会出现一个详细视图。我不会有任何麻烦,但我的应用程序将在平板电脑和手机上运行,我想在平板电脑上模态显示此详细视图,并且通常(使用 fragmentManager.beginTransaction().add(...))在手机上。
我知道如何创建 DialogFragment(事实上,我在应用程序的其他地方使用了一个),但我不确定 DialogFragment 是否可以用于正常事务。
而且我不知道如何区分我的应用是在手机还是平板电脑上运行(除了在 layout-sw600dp 文件夹中创建布局)
编辑
嗯,感谢玛格丽塔的回答,我找到了一个解决方案(不是唯一一个,而是一些可能性之一)。
1) 将 B 定义为 DialogFragment
2) 使用此代码在 res/values 文件夹中创建 values.xml
<bool name="isTablet">false</bool>
3) 使用此代码在 res/values-sw600dp 文件夹中创建另一个 values.xml。这样,我有一个布尔资源告诉我应用程序是否在平板电脑上运行。
<bool name="isTablet">true</bool>
4) 在 Fragment A(负责展示 Fragment B)上,创建一个类似这样的方法:
private void showFragmentB(){
Resources res = getResources();
boolean isTablet = res.getBoolean(R.bool.isTablet);
if (isTablet) {
// We're running on a tablet, so we show Fragment B as a dialog
FragmentB.newInstance().show(getActivity().getSupportFragmentManager(), FragmentB.class.toString());
} else {
// We're running on a phone, adding Fragment B to the stack
// with some animation
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.abc_slide_in_bottom, R.anim.abc_slide_out_bottom);
transaction.add(R.id.container, FragmentB.newInstance(), FragmentB.class.toString());
transaction.addToBackStack(FragmentB.class.toString());
transaction.commit();
}
}
5) 每当出现片段 B 时调用该方法。
谢谢你帮助我。
【问题讨论】:
-
“我不确定 DialogFragment 是否可以用于正常事务”——AFAIK 可以。这样比较方便。 “除了在 layout-sw600dp 文件夹中创建布局”——好吧,如果您不需要自定义布局,您可以创建一个
res/values-sw600dp/bools.xml来拥有一个boolean资源。不过,我会使用资源,而不是在运行时使用DisplayMetrics或其他方式查找内容。