HoneyCombのフラグメントデザインから始めました。 2つのフラグメントを作成しました。左側のフラグメントのボタンをクリックすると、右側に新しいフラグメントが作成されます。一方、右側のフラグメントのボタンをクリックすると(つまり、以下のコードのDetialsFragmentは別のフラグメントに置き換えられるはずです。main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="horizontal" >
<fragment class="com.fragment.example.Titles"
Android:id="@+id/titles" Android:layout_weight="1"
Android:layout_width="0px"
Android:layout_height="match_parent" />
<FrameLayout Android:id="@+id/details" Android:layout_weight="1"
Android:layout_width="0px"
Android:layout_height="match_parent" />
</LinearLayout>
FragmentExample.Java
public class FragmentExample extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Titles.Java
public class Titles extends Fragment {
public FragmentTransaction ft;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.main1, null);
Button button1 = (Button)v.findViewById(R.id.button1);
button1.setText("santhosh");
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
DetailsFragment details = (DetailsFragment)
getFragmentManager().findFragmentById(R.id.details);
if (details == null || details.getShownIndex() != 1) {
// Make new fragment to show this selection.
details = DetailsFragment.newInstance(1);
// Execute a transaction, replacing any existing
// fragment with this one inside the frame.
ft
= getFragmentManager().beginTransaction();
ft.add(R.id.details, details, "detail");
ft.setTransition(
FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
}
});
return v;
}
}
DetailsFragment.Java
public class DetailsFragment extends Fragment {
/**
* Create a new instance of DetailsFragment, initialized to
* show the text at 'index'.
*/
Titles title = new Titles();
String[] titles = {"Title1", "Title2", "Title3", "Title4"};
public static DetailsFragment newInstance(int index) {
DetailsFragment f = new DetailsFragment();
// Supply index input as an argument.
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
public int getShownIndex() {
return getArguments().getInt("index", 0);
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
if (container == null) {
// Currently in a layout without a container, so no
// reason to create our view.
return null;
}
Button button = new Button(getActivity());
button.setText("Next");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
return button;
}
}
次に、ボタンが表示され、クリックイベントが発生すると、クリックイベントで次を呼び出すことができます。
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.details, new NewFragmentToReplace(), "NewFragmentTag");
ft.commit();
バックをクリックしてDetailsFragmentに戻りたい場合は、上記のトランザクションをバックスタックに追加してください。
ft.addToBackStack(null);
それとも何か不足していますか?あるいは、あなたのアクティビティがボタンのクリックイベントを取得し、詳細ペインのフラグメントを置き換える責任があることを提案する人もいます。
以下のコードを試すことができます。古いフラグメントから新しいフラグメントをプッシュするための非常に簡単な方法です。
private int mContainerId;
private FragmentTransaction fragmentTransaction;
private FragmentManager fragmentManager;
private final static String TAG = "DashBoardActivity";
public void replaceFragment(Fragment fragment, String TAG) {
try {
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(mContainerId, fragment, tag);
fragmentTransaction.addToBackStack(tag);
fragmentTransaction.commitAllowingStateLoss();
} catch (Exception e) {
// TODO: handle exception
}
}
つかいます Android.support.v4.app
あなたのコードのFragmentManagerとFragmentTransactionについては、うまくいきました。
DetailsFragment detailsFragment = new DetailsFragment();
Android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
Android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.details,detailsFragment);
fragmentTransaction.commit();
既存のフラグメントへのハンドルがある場合は、フラグメントのIDでそれを置き換えることができます。
Kotlinの例:
fun aTestFuction() {
val existingFragment = MyExistingFragment() //Get it from somewhere, this is a dirty example
val newFragment = MyNewFragment()
replaceFragment(existingFragment, newFragment, "myTag")
}
fun replaceFragment(existing: Fragment, new: Fragment, tag: String? = null) {
supportFragmentManager.beginTransaction().replace(existing.id, new, tag).commit()
}
fragmentに置き換える方法は非常に簡単です。
DataFromDb changeActivity = new DataFromDb();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.changeFrg, changeActivity);
transaction.commit();