フラグメントを使用してマスター/詳細フローを持つアプリケーションを作成しようとしています。アイテムを選択すると、詳細フラグメントが開き、別のフラグメントを「開く」ことができ、それをバックスタックに追加することができます。マスター/詳細フローでフラグメントを切り替える
私は、彼らが何をするかを説明するためにクラス名を変更しました。
public class ListOfDetails extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
}
//Callback method indicating that an item with the given ID was selected.
public void onItemSelected(String id) {
// Performing logic to determine what fragment to start omitted
if (ifTwoPanes()) {
Fragment fragment = new DetailFragmentType1();
getSupportFragmentManager().beginTransaction().replace(R.id.aContainer, fragment).commit();
} else {
Intent newIntent = new Intent(this, SinglePaneFragmentWrapper.class);
newIntent.putExtra("id", id);
startActivity(newIntent);
}
}
// My attempt at making it possible to change displayed fragment from within fragments
public void changeDetailFragment(Fragment fragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack(null);
transaction.replace(R.id.aContainer, fragment);
transaction.commit();
}
}
詳細フラグメントの1つの例。異なる状況で作成される可能性がある多くの異なるフラグメントがあります。電話で、ラッパー活性はフラグメントを保持するために使用される場合
public class DetailFragmentType1 extends Fragment {
private ListOfDetails parent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Activity a = getActivity();
if (a instanceof ListOfDetails) {
parent = (ListOfDetails) a;
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Button aButton = (Button) getActivity().findViewById(R.id.aButton);
aButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
parent.changeDetailFragment(new SubDetailFragment());
}
});
}
}
public class SinglePaneFragmentWrapper extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Duplicate logic must be performed to start fragment
// Performing logic to determine what fragment to start omitted
String id = getIntent().getStringExtra("id");
if(id == "DetailFragmentType1") {
Fragment fragment = new DetailFragmentType1();
getSupportFragmentManager().beginTransaction().replace(R.id.aContainer, fragment).commit();
} else {
...
}
}
}
この状況で、詳細ペインに開かれているフラグメントを変更する適切な方法は何ですか?私の方法は、2つのペインを使用するときのハックのように感じ、1つのペインを使用するときには機能しません。parent.changeDetailFragment()
を呼び出せなくなるため、SinglePaneFragmentWrapperのgetParent()
がnullを返すためです。
これは複雑な質問です。うまくいけばそれをうまく説明しました。私が何かを見逃したら私に知らせてください。ありがとう