Android 如何用另一个片段替换片段?

Android 如何用另一个片段替换片段?,android,android-fragments,fragmentmanager,Android,Android Fragments,Fragmentmanager,我在碎片上遇到了麻烦。我有两个片段&两个片段都包含列表。我正在做的是,当用户点击按钮时,应该从另一个片段替换该片段。当我点击按钮时,我遇到的问题是,另一个片段在下面指向当前片段 屏幕截图 main活动 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedIns

我在碎片上遇到了麻烦。我有两个片段&两个片段都包含列表。我正在做的是,当用户点击按钮时,应该从另一个片段替换该片段。当我点击按钮时,我遇到的问题是,另一个片段在下面指向当前片段

屏幕截图

main活动

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void selectFrag(View view) {
        Fragment fr;

        if(view == findViewById(R.id.button2)) {
            fr = new FragmentTwo();

        }else {
            fr = new FragmentOne();
        }

        FragmentManager fm = getFragmentManager();
        FragmentTransaction fragmentTransaction = fm.beginTransaction();
        fragmentTransaction.replace(R.id.fragment_place, fr);
        fragmentTransaction.commit();

    }

}
    Button btnList = (Button) findViewById(R.id.btnList);
    Button btnGrid = (Button) findViewById(R.id.btnGrid);
    btnList.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final Fragment listfragment = new ListFragment();
            getSupportFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragment_place, listfragment).commit();

        }
    });
    btnGrid.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final Fragment gridfragment = new GridFragment();
            getSupportFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragment_place, gridfragment).commit();
        }
    });
FragmentOne.Class

public class FragmentOne extends ListFragment implements OnItemClickListener {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        return inflater.inflate(R.layout.fragment_one, container, false);
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(), R.array.action, android.R.layout.simple_list_item_1);
        setListAdapter(adapter);
        getListView().setOnItemClickListener(this);
    }
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
        Object o = this.getListAdapter().getItem(position);
        String pen = o.toString();

        // Toast.makeText(getActivity(), pen, Toast.LENGTH_SHORT).show();
    }



}
public class FragmentTwo extends ListFragment implements OnItemClickListener {



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        return inflater.inflate(R.layout.fragment_two, container, false);
    }



    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(), R.array.type, android.R.layout.simple_list_item_1);
        setListAdapter(adapter);
        getListView().setOnItemClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
        Object o = this.getListAdapter().getItem(position);
        String pen = o.toString();

        // Toast.makeText(getActivity(), pen, Toast.LENGTH_SHORT).show();
    }

}
public类FragmentOne扩展了ListFragment实现了McClickListener{
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
返回充气机。充气(R.layout.fragment_one,容器,假);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
ArrayAdapter=ArrayAdapter.createFromResource(getActivity(),R.array.action,android.R.layout.simple\u list\u item\u 1);
setListAdapter(适配器);
getListView().setOnItemClickListener(此);
}
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
对象o=this.getListAdapter().getItem(位置);
String pen=o.toString();
//Toast.makeText(getActivity(),pen,Toast.LENGTH_SHORT).show();
}
}
片段二类

public class FragmentOne extends ListFragment implements OnItemClickListener {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        return inflater.inflate(R.layout.fragment_one, container, false);
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(), R.array.action, android.R.layout.simple_list_item_1);
        setListAdapter(adapter);
        getListView().setOnItemClickListener(this);
    }
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
        Object o = this.getListAdapter().getItem(position);
        String pen = o.toString();

        // Toast.makeText(getActivity(), pen, Toast.LENGTH_SHORT).show();
    }



}
public class FragmentTwo extends ListFragment implements OnItemClickListener {



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        return inflater.inflate(R.layout.fragment_two, container, false);
    }



    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(), R.array.type, android.R.layout.simple_list_item_1);
        setListAdapter(adapter);
        getListView().setOnItemClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
        Object o = this.getListAdapter().getItem(position);
        String pen = o.toString();

        // Toast.makeText(getActivity(), pen, Toast.LENGTH_SHORT).show();
    }

}
public类FragmentTwo扩展了ListFragment实现了McClickListener{
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
返回充气机。充气(右布局图。碎片2,容器,假);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
ArrayAdapter=ArrayAdapter.createFromResource(getActivity(),R.array.type,android.R.layout.simple\u list\u item\u 1);
setListAdapter(适配器);
getListView().setOnItemClickListener(此);
}
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
对象o=this.getListAdapter().getItem(位置);
String pen=o.toString();
//Toast.makeText(getActivity(),pen,Toast.LENGTH_SHORT).show();
}
}
主要活动

<?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="vertical">

    <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="selectFrag"
        android:text="Fragment No.1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="selectFrag"
        android:text="Fragment No.2" />

    <fragment
        android:id="@+id/fragment_place"
        android:name="com.example.pitech09.myapplication.FragmentOne"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

在您的main活动中使用此代码

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void selectFrag(View view) {
        Fragment fr;

        if(view == findViewById(R.id.button2)) {
            fr = new FragmentTwo();

        }else {
            fr = new FragmentOne();
        }

        FragmentManager fm = getFragmentManager();
        FragmentTransaction fragmentTransaction = fm.beginTransaction();
        fragmentTransaction.replace(R.id.fragment_place, fr);
        fragmentTransaction.commit();

    }

}
    Button btnList = (Button) findViewById(R.id.btnList);
    Button btnGrid = (Button) findViewById(R.id.btnGrid);
    btnList.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final Fragment listfragment = new ListFragment();
            getSupportFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragment_place, listfragment).commit();

        }
    });
    btnGrid.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final Fragment gridfragment = new GridFragment();
            getSupportFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragment_place, gridfragment).commit();
        }
    });

正如@RishabhDuttSharma所建议的,在活动布局中使用
FrameLayout
而不是
fragment
,并初始化代码中的第一个片段

布局:

<FrameLayout
    android:id="@+id/fragment_place"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
//主要活动

<?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">
<!-- a frame layout for replace in full-->
        <FrameLayout
                android:id="@+id/fragment_place"
                android:layout_width="fill_parent"
                android:layout_height="match_parent"/>

    </LinearLayout>

//与您在下一个片段中必须执行的操作相同,当应用程序首次启动时,不会显示任何片段,对吗?当应用程序启动时,会显示FragmentOne确保
R.id.fragment\u place
对应于布局容器(例如,
FrameLayout
)我添加了活动_main使用
FrameLayout
像@RishabhDuttSharma建议的那样,并在codeUse frame Layout中初始化FragmentOne,而不是Fragment@KritiJain.@kovart另一个问题是,您建议使用
getSupportFragmentManager
,但他没有使用
AppCompatActivity
,因此应该使用
getFragmentManager
。是的,但使用getSupportFragmentManager的最佳方法