新しいネストされたフラグメントAPIでonActivityResult()が呼ばれない
質問
私はこれまで、新しい ネストされたフラグメント API が Android のサポート ライブラリに含まれています。
ネストされたフラグメントで直面している問題は、ネストされたフラグメント (つまり、他のフラグメントに
FragmentManager
が返す
getChildFragmentManager()
) の呼び出し
startActivityForResult()
を呼び出すと、ネストされたフラグメントの
onActivityResult()
メソッドは呼び出されません。しかし、親フラグメントの
onActivityResult()
とアクティビティーの
onActivityResult()
が呼び出されます。
ネストされたフラグメントについて何か見逃しているのかどうかは分かりませんが、記述された動作は予想外でした。以下は、この問題を再現するコードです。誰かが正しい方向を示し、私が間違っていることを説明してくれるなら、非常に感謝します。
package com.example.nestedfragmentactivityresult;
import android.media.RingtoneManager;
import android.os.Bundle;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends FragmentActivity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, new ContainerFragment())
.commit();
}
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
// This is called
Toast.makeText(getApplication(),
"Consumed by activity",
Toast.LENGTH_SHORT).show();
}
public static class ContainerFragment extends Fragment
{
public final View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState)
{
View result = inflater.inflate(R.layout.test_nested_fragment_container,
container,
false);
return result;
}
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
getChildFragmentManager().beginTransaction()
.add(R.id.content, new NestedFragment())
.commit();
}
public void onActivityResult(int requestCode,
int resultCode,
Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
// This is called
Toast.makeText(getActivity(),
"Consumed by parent fragment",
Toast.LENGTH_SHORT).show();
}
}
public static class NestedFragment extends Fragment
{
public final View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState)
{
Button button = new Button(getActivity());
button.setText("Click me!");
button.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
startActivityForResult(intent, 0);
}
});
return button;
}
public void onActivityResult(int requestCode,
int resultCode,
Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
// This is NOT called
Toast.makeText(getActivity(),
"Consumed by nested fragment",
Toast.LENGTH_SHORT).show();
}
}
}
test_nested_fragment_container.xmlは。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
どのように解決するのですか?
そうです。
onActivityResult()
はこの方法では呼び出されません。
onActivityResultの呼び出し順序(Androidサポートライブラリ内)は以下の通りです。
-
Activity.dispatchActivityResult()
. -
FragmentActivity.onActivityResult()
. -
Fragment.onActivityResult()
.
3番目のステップでは、フラグメントは
FragmentMananger
の親
Activity
. つまり、この例では、ディスパッチするために見つかったコンテナフラグメントは
onActivityResult()
であり、ネストされたフラグメントはイベントを受け取ることができません。
で独自のディスパッチを実装する必要があると思います。
ContainerFragment.onActivityResult()
で、ネストしたフラグメントを見つけて呼び出し、結果とデータを渡す必要があります。
関連
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
Java基礎 - マッピングとQ/A
-
アクセス制限の解決方法: ---- in Java
-
ApiModel と @ApiModelProperty の使用法
-
[解決済み] FragmentでonActivityResultが呼び出されない
-
[解決済み] 新しいAndroid Fragmentをインスタンス化するためのベストプラクティス
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse問題 アクセス制限。タイプ 'SunJCE' が API でないことを解決し、/jdk ディレクトリにある /jre と jre の違いについて理解を深める。
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
Java の double データ型における 0.0 と -0.0 の問題
-
アクセス制限の解決方法: ---- in Java
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ
-
[解決済み] FragmentでonActivityResultが呼び出されない