18

我刚刚查看了 Master/Detail Flow 模板,但我无法弄清楚 2 件事。

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

import android.support.v4.app.FragmentActivity;

2)如果它足够大,主Activity如何知道是在新Activity中显示细节还是在细节窗格中显示细节?它似乎是通过以下代码实现的:

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,因为它似乎从未被打开/膨胀。

有什么线索吗?

4

6 回答 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。

于 2012-07-12T09:15:23.880 回答
13

这对我有用。

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

2)“AndroidManifest.xml”:将 minSdkVersion 设置为 10(姜饼)。我认为你可以再低一点。

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 中运行。

__溶胶

于 2012-12-23T08:30:39.663 回答
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);
于 2012-08-31T19:34:36.143 回答
0

我认为 Master/Detail Flow 模板需要 api 级别 11,因为它使用操作栏。我将尝试将此模板与ActionBarSherlcock一起使用,看看它是否适用于 android 2.2 或 2.3。

于 2012-08-09T02:37:31.020 回答
0

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

于 2012-10-07T16:01:43.247 回答
0

您问题第二部分中使用的技术是Layout Alias的一个示例。

于 2012-10-08T11:07:41.053 回答