关于Master/Detail Flow模板的两个问题

18

我刚刚查看了主/细节流模板,但有两件事我不明白。

1)为什么它需要 Android 11 版本,而它生成的代码似乎使用了 Fragment 兼容性支持? 特别是,为什么不能生成运行在 Android 8 版本上的模板?(例如这个导入)

import android.support.v4.app.FragmentActivity;

2) 主活动如何知道在新活动中显示详细信息还是在详情面板中显示(如果足够大)?似乎通过以下代码实现:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_item_list);

    if (findViewById(R.id.item_detail_container) != null) {
        mTwoPane = true;
        ((ItemListFragment) getSupportFragmentManager()
                .findFragmentById(R.id.item_list))
                .setActivateOnItemClick(true);
    }
}

setContentView(R.layout.activity_item_list);将布局设置为ListFragment,它仅设置了自己的适配器,但我不明白为什么findViewById(R.id.item_detail_container) != null永远不会返回true,因为它似乎从未被打开/充气。

有什么线索吗?


要调用片段API,您的目标应该是API 11。 - user468311
但它们并不是真正的片段。它们的导入是通过android.support.v4.app.ListFragment进行的,而不是android.app.Fragment。因此,它们是兼容片段,应该可以在1.6版本上访问。 - Mike T
我猜这是为了使应用程序能够在api4和api11上运行。使用目标api 11,您仍然可以在api4上运行应用程序。 - user468311
我知道,但我想在Android 2.2设备上运行该应用程序。不过,我的主要关注点是问题2。 - Mike T
6个回答

14

经过长时间的搜索,答案是由于在values-large/refs.xml中出现了这个原因。

<resources>
    <item type="layout" name="activity_item_list">@layout/activity_item_twopane</item>
</resources>

它将对正常布局的请求重定向到一个更大的布局(双窗格版本),该布局中定义了R.id.item_detail_container

这相当难懂。我不确定为什么他们不只是将大型布局称为与正常布局相同但具有不同xml的名称。


谢谢,我也一直很好奇这个问题。我一直在尝试寻找描述模板及其工作原理的文档,但是我没有找到任何相关的资料。你知道是否存在这样的文档吗? - span
我不知道任何相关的信息。抱歉 :) - Mike T
4
我认为他们使用这种引用类型是因为双面板布局在两种情况下都会被使用——通过"values-large"和"values-sw600dp"进行引用。采用你提出的方法("layout-large","layout-sw600dp"),你需要复制"activity_item_twopane"布局,这对于未来的维护来说并不那么优雅。 - peter.bartos
"activity_item_list" 在这里是一个别名,它将引用您在手机上正常使用的“activity_item”布局,或者在平板电脑上将引用“activity_item_twopane”的布局。这是因为当Android OS检测到它正在平板电脑上运行时,将会读取您在values-sw600dp(适用于较新的平板电脑)或values-large(适用于较老的平板电脑)中的refs.xml文件。据我所知,将refs.xml文件复制到values-sw600dp和values-large中是可以的。无论如何,这就是我正在阅读的书籍中所做的。 - JDJ
这帮助了我解决另一个问题,谢谢! - Viral Patel

13

这是对我有效的方法。

1)将ActionBarSherlock添加到项目中:项目 -> 属性 -> Android -> 选择ActionBarSherlock并按“添加”按钮。如果您没有ABS,则需要在继续之前从http://actionbarsherlock.com/获取它。

2)“AndroidManifest.xml”:将minSdkVersion设置为10(Gingerbread)。我认为您甚至可以降低版本要求。

android:minSdkVersion="10"

3) "activity_item_list.xml": 只需删除"list_content",因为Eclipse会不停地提示需要Honeycomb或更高版本。

tools:layout="@android:layout/list_content"  <-- remove

4) "activity_item_twopane.xml": 删除 Honeycomb 或更高版本的代码行。

android:divider="?android:attr/dividerHorizontal"  <-- remove
tools:layout="@android:layout/list_content"        <-- remove

5) ItemListActivity.java: 使用SherlockFragmentActivity。

//public class ItemListActivity extends FragmentActivity implements
public class ItemListActivity extends SherlockFragmentActivity implements

6) ItemListFragment.java:修改参数以设置setListAdapter()。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // TODO: replace with a real list adapter.
        //setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
        //    android.R.layout.simple_list_item_activated_1,
        //    android.R.id.text1, DummyContent.ITEMS));

        int layout = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) ?
            android.R.layout.simple_list_item_activated_1 :
            android.R.layout.simple_list_item_checked;

        setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
            layout, DummyContent.ITEMS));
}

7) "ItemDetailActivity.java": 使用SherlockFragmentActivity和getSupportActionBar()。

//public class ItemDetailActivity extends FragmentActivity {
public class ItemDetailActivity extends SherlockFragmentActivity {
    ...
    //getActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

在进行了修改之后,该应用程序可以在Gingerbread、ICS和Jelly Bean上运行。

__


我在manifest.xml中设置了最低API为8,但我仍然无法在2.2和2.3模拟器上运行它,我错过了什么? - Eric
你至少为我节省了几个小时。我不明白为什么Android的异常信息那么不具体。我只收到了“在完成膨胀时出现空指针异常”的提示。 - Sergi0

2

关于您的第一个问题:

您需要更改ItemListFragment类中的内容:

原文如下:

setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
                R.layout.simple_list_item_activated_1,
                R.id.text1,
                DummyContent.ITEMS));

针对这个问题:

setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
               R.layout.simple_list_item_1,
               R.id.text1,
               DummyContent.ITEMS));

ItemDetailActivity中,注释掉这一行:
// getActionBar().setDisplayHomeAsUpEnabled(true);

您真棒!虽然您可以从ActionBarActivity扩展并更改为getSupportActionBar().setDisplayHomeAsUpEnabled(true);,而不是将其注释掉。 - Nuno Silva

0
关于第一个问题,需要 V11 的原因之一是它使用了 list_content,而这不包含在兼容性库中。解决方法是 here

0

你问题的第二部分所使用的技术是布局别名的一个例子。


0

我认为 Master/Detail Flow 模板需要 API 等级 11,因为它使用 Action Bar。我将尝试使用 ActionBarSherlock 这个模板,并查看它是否可以在 Android 2.2 或 2.3 上工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接