0

だから私はフラグメントでいくつかの経験を得ようとしていますが、いくつかの障害を見つけています。

私の現在の状況は以下の通りです。

「呼び出し」アクティビティから送信された Extra Intent パラメータによって内容が決定されるリストを表示するアクティビティがあります。

この List アクティビティは、次のように XML で宣言された ListFragment を使用します。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent" android:background="@color/black">
    <fragment class="com.pixlworks.NLC.DirectoryBrowse$ListingFragment"
              android:id="@+id/listing"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />

</FrameLayout>

現在、アクティビティ インテント (または利用可能な場合は保存されたバンドル) の追加データにアクセスすることにより、フラグメント内のコンテンツのタイプを直接示すパラメーターを取得します。

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if (savedInstanceState != null)
        mListingType = savedInstanceState.getString(Utils.DIRECTORY_TYPE_STORE_KEY);
    else
        mListingType = getActivity().getIntent().getStringExtra(Utils.DIRECTORY_TYPE_STORE_KEY);

    // get content by type, create and set the adapter

}

今私の問題の一部は、これがそのパラメーターをアクティビティからフラグメントに「渡す」正しい方法であるかどうかわからないことです。

その上、アクション バーの UP ナビゲーションを使用すると、このセットアップで問題が発生します。このリスト アクティビティのアイテムをクリックすると、選択したアイテムの詳細を表示する別のアクティビティに移動します。この詳細アクティビティから:

  • 戻るボタンを使用すると、通常どおりリスト アクティビティがスタックから戻され、すべて正常に動作します。

  • ActionBar の UP を使用すると (次の手順にもかかわらず)、スタック内のインスタンスを使用する代わりに新しいインスタンスが作成され、この新しいインスタンスは明らかにインテントで Extra パラメータを取得していないように見えます。保存されたバンドルまたはインテントに値が存在することを期待しているため、この状況でアプリがクラッシュします。

要約すると、これらのどれに従うべきか、「UP」ナビゲーションで適切に機能させる方法がわかりません。

A) アクティビティのフィールドに「type」パラメーターを保持し、それをアクティビティの Bundle onSaveInstanceState に保存します。その場合、値をフラグメントに渡す方法がわかりません。この場合、UP がアクティビティ リストの既存のインスタンスを呼び出すことを確認する必要があります。

B) アクティビティではなくフラグメントに値を保存する現在の設定を続行しますが、UP ナビゲーションを正しく処理するにはどうすればよいですか?

ここで同時に複数のことを尋ねていることは承知していますが、それらはすべて関連しているので、これについて何らかの助けが得られることを願っています.

事前に助けてくれてありがとう!

4

1 に答える 1

0

UP ナビゲーションは、同じアクティビティ レベル内で使用する方が理にかなっています。これが、開発者ページで従ったコードの意図です。新しいアクティビティを開始したため、戻るボタンなどの前のアクティビティに戻りたい場合は、finish()最初に詳細アクティビティを破棄するために呼び出す必要があります。

アクティビティからフラグメントへのデータの受け渡しに関しては、フラグメントの新しいインスタンスを作成するときに、データをバンドルとして渡すことができます。次に例を示します。

// in fragment class
public static MyFragment newInstance(Bundle arg) {
    MyFragment f = new MyFragment();
    f.setArguments(arg);
    return f;
}

新しいフラグメントを作成するときは、次を呼び出すことができます。

// in activity
Bundle arg = new Bundle();
int info = ...;
arg.putInt("INFO",info); 
...
MyFragment mFragment = MyFragment.newInstance(arg);

最後に、データをフラグメントで取得するには:

int info = getArguments().getInt("INFO");
...

フラグメントをインスタンス化するために直接呼び出すのではなくMyFragment mFragment = new MyFragment()、静的メソッドを使用してインスタンス化する必要があります。これは、画面を回転させたときにフレームワークが public の空のコンストラクターが見つからないと不平を言う場合に発生する可能性のあるクラッシュを防ぐためです。


アップデート

質問に答えるには:

1) アクティビティ A -> アクティビティ B から開始するとします。その後、アクティビティ B で上ボタンを押します。使用のロジックにより、上ボタンはアクティビティ A に戻ることはありません。これは、その意図が 1 レベル上に移動することですが、アクティビティ B の内部に移動することであるためです。アクティビティ A に戻るには、finish()最初にアクティビティ B を破棄するために呼び出す必要があります。

2) フラグメントが xml で作成されている場合でも、引数を設定できます。あなたの xml で、fragment の id を設定してandroid:id="@+id/fragment_id"から、

// in activity
FragmentManager fm = getSupportFragmentManager(); // or getFragmentManager() if you don't have backward compatibility
MyFragment mFragment = fm.findFragmentById(R.id.fragment_id);
Bundle arg = new Bundle();
// put data blah blah
mFragment.setArguments(arg);

フラグメントを使用する前に、必ず引数を設定してください。

簡単に言うと、intent呼び出しアクティビティ間でデータを渡すときに使用されます。bundleアクティビティからフラグメントにデータを渡したい場合に使用されます。

于 2013-09-19T03:25:27.767 に答える