18

マスター/詳細フローテンプレートを見たところ、2つのことがわかりません。

1)生成されるコードがフラグメント互換性サポートを使用しているように見えるのに、なぜAndroidバージョン11が必要なのですか?特に、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);レイアウトをaListFragmentに設定します。これは、独自のアダプターを設定するだけですが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が定義されているより大きなレイアウト (2 ペイン バージョン) にリダイレクトします。

これはかなり難読化されています。大きなレイアウトを通常のレイアウトと同じように呼び出すだけでなく、xml が異なる理由がわかりません。

于 2012-07-12T09:15:23.880 に答える
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 で動作しました。

_ソル

于 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

マスター/詳細フローテンプレートはアクションバーを使用するため、APIレベル11が必要だと思います。このテンプレートをActionBarSherlcockで使用して、Android2.2または2.3で機能するかどうかを確認します。

于 2012-08-09T02:37:31.020 に答える
0

質問の 2 番目の部分で使用されている手法は、Layout Aliasの例です。

于 2012-10-08T11:07:41.053 に答える
0

最初の質問に関して、V11 が必要な理由の 1 つは、list_content を使用していて、それが互換性ライブラリに含まれていないことです。そのための回避策はこちらです。

于 2012-10-07T16:01:43.247 に答える