replace碎片不工作/我正在执行这个正确的方法?

我花了一段时间才把头围在碎片上,但是这应该是我最后一个片段的问题,因为我想我只是把它们放下了。 我知道这是一个巨大的代码通过。 但是,我会很感激这个帮助,确保我没有破坏任何基本的片段。

我将发布我的所有代码,只是为了看看是否有人可以“仔细查看”,看看我是否犯了重大错误,或者我应该走更简单的路线。 最后,正如标题所述,我的片段不会被replace…它将被添加到顶部。

文件树:

在这里输入图像说明

MainActivity.java

package com.example.learn.fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; public class MainActivity extends FragmentActivity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } /* Add a class to handle fragment */ public static class SSFFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View v = inflater.inflate(R.layout.choose_pill_frag, container, false); return v; } } public void red(View view) { // Create new fragment and transaction ExampleFragments newFragment = new ExampleFragments(); android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack transaction.replace(R.id.frag, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit(); } public void blue(View view) { //Figure out code for "red" first } } 

ExampleFragments.java:

 package com.example.learn.fragments; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class ExampleFragments extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.red_pill_frag, container, false); } } 

ActivityMain.xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <fragment android:id="@+id/frag" android:layout_width="match_parent" android:layout_height="match_parent" class="com.example.learn.fragments.MainActivity$SSFFragment" /> </RelativeLayout> 

choose_pill_frag.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageButton android:id="@+id/imageButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:onClick="blue" android:src="@drawable/blue" /> <ImageButton android:id="@+id/imageButton2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:onClick="red" android:src="@drawable/red" /> </RelativeLayout> 

red_pill_frag.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="You stay in Wonderland and I show you how deep the rabbit-hole goes." android:textAppearance="?android:attr/textAppearanceLarge" /> </RelativeLayout> 

应用程序应该显示两个button。 两个button存在于一个单独的片段中,然后如果您按下button,片段将被replace为显示正确文本的新片段。 到现在为止,它应该取代,但似乎只是把它加在上面。

在布局xml中使用<FrameLayout>代替<fragment>来执行活动。

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container_id" android:layout_width="match_parent" android:layout_height="match_parent" /> 

然后在onCreate中的FragmentActivity添加初始片段(在你的情况SSFFragment ):

  FragmentA fragmentA = new FragmentA(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.add(R.id.container_id, fragmentA); transaction.commit(); 

从里面的片段,你可以更换容器中的片段。

 class FragmentA extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Button button = new Button(getActivity()); button.setText("Replace"); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); FragmentB fragmentB = new FragmentB(); transaction.replace(R.id.container_id, fragmentB); transaction.commit(); } }); return button; } } 

这是你真正的问题的答案…因为这是你原来的第二个问题,我修改了解决scheme,以另一种方式得到这个碎片:

 Fragment details = (Fragment)getSupportFragmentManager().findFragmentById(R.id.details); details = new ExamplesFragment(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); 

此外, android.support.v4.app部分是没有必要的,坦率地说,通过在你的代码中添加和删除它(只要你使用: )

 import android.support.v4.app.FragmentTransaction; 

在这个例子中,你不需要导入对FragmentManager的支持。 但是,如果出现错误,请确保已经将库本身导入到“libs”文件夹中。

这个解决scheme将解决重叠的片段问题,并希望能够帮助人们节省更换碎片的时间。

以及我面临同样的问题,我只是用线性布局replace主布局的片段,并猜测它的工作..其奇怪的不知道如何,但它的工作。 我正在使用操作栏来切换片段replace我的代码是:

  protected class MyTabsListener1 implements ActionBar.TabListener{ private Fragment frag ; public MyTabsListener1 ( Fragment frag){ this.frag = frag; } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { switch (tab.getPosition()){ case 0: ft.replace(R.id.replace, homeFrag); break; case 1: ft.replace(R.id.replace, createFrag); break; case 2: ft.replace(R.id.replace, ioListFrag); break; case 3: ft.replace(R.id.replace, settingFrag); break; default: break; } } 

而我的主要布局是这样的:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/replace" android:layout_width="wrap_content" android:layout_height="match_parent" > </LinearLayout> </LinearLayout> 

简而言之,如果你用带有片段标签的XML定义它,你不能replace片段。 相反,作为@pawelziebabuild议在您的布局添加帧标签,find它,并添加,删除,replace碎片..希望它有帮助。 干杯

使用片段的主要好处是能够使它们占据屏幕的一部分,而不是整个屏幕,这是活动的作用。

如果你只是制作一个小屏幕的应用程序,就像一个活动,但在碎片编码,只需为每个FragmentActivity做一个单独的FragmentActivity。

做这个你的FragmentActivity的onCreate:

 public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.emptylayout); FragmentManager fragmentManager = getSupportFragmentManager(); //Or getFragmentManager() if you're not using the support library FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); YourFragment fragment = new YourFragment(); fragmentTransaction.add(R.id.emptyview, fragment); fragmentTransaction.commit(); } 

其中layout / emptylayout是一个带有FrameLayout的XML布局文件。 id / emptyview是那个FrameLayout。

如果您想要为片段的实际布局使用XML,请为实际片段制作一个单独的XML布局,并在片段的“onCreateView”中对其进行膨胀:

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.files, container, false); // Do stuff here return view; } 

然后,只需使用startActivity(new Intent(getActivity(), YourFragmentActivity.class))从Fragment启动FragmentActivity。

看起来多余,是的,​​但是如果你以后要瞄准更大的屏幕(如果没有的话,你为什么还要打碎碎片?),从长远来看这会更容易一些。