关于主/细节流模板的两个问题

Mik*_*e T 18 android

我刚刚看了一下Master/Detail Flow模板,我无法弄清楚2件事情.

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

import android.support.v4.app.FragmentActivity;
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

setContentView(R.layout.activity_item_list);将布局设置为ListFragment只设置自己的适配器,但我看不出如何findViewById(R.id.item_detail_container) != null返回true,因为它似乎永远不会被打开/膨胀.

有线索吗?

Mik*_*e T 14

经过深思熟虑,答案就是因为这个 values-large/refs.xml

<resources>
    <item type="layout" name="activity_item_list">@layout/activity_item_twopane</item>
</resources>
Run Code Online (Sandbox Code Playgroud)

它将正常布局的请求重定向到定义的更大布局(双窗格版本)R.id.item_detail_container.

这很混乱.我不确定为什么他们不只是将大型布局称为与普通布局相同,而是使用不同的xml.

  • 我认为他们使用这种类型的引用,因为twopane布局在两种情况下使用 - 由values-large和值-sw600dp引用.使用您建议的方法(layout-large,layout-sw600dp),您将需要复制activity_item_twopane布局,这对于将来的维护来说并不是那么优雅. (4认同)

小智 13

这对我有用.

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

2)"AndroidManifest.xml":将minSdkVersion设置为10(Gingerbread).我认为你可以更低.

android:minSdkVersion="10"
Run Code Online (Sandbox Code Playgroud)

3)"activity_item_list.xml":只需删除"list_content",因为Eclipse一直抱怨你需要Honeycomb或更高版本.

tools:layout="@android:layout/list_content"  <-- remove
Run Code Online (Sandbox Code Playgroud)

4)"activity_item_twopane.xml":删除Honeycomb-or-later行.

android:divider="?android:attr/dividerHorizontal"  <-- remove
tools:layout="@android:layout/list_content"        <-- remove
Run Code Online (Sandbox Code Playgroud)

5)ItemListActivity.java:使用SherlockFragmentActivity.

//public class ItemListActivity extends FragmentActivity implements
public class ItemListActivity extends SherlockFragmentActivity implements
Run Code Online (Sandbox Code Playgroud)

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));
}
Run Code Online (Sandbox Code Playgroud)

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

//public class ItemDetailActivity extends FragmentActivity {
public class ItemDetailActivity extends SherlockFragmentActivity {
    ...
    //getActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)

在进行更改后,该应用程序在Gingerbread,ICS和Jelly Bean中运行.

__ sol