如何用另一个片段替换片段?
How to replace fragment with another fragment?
我在片段中遇到了麻烦。我有两个片段,两个片段都包含列表。我正在做的是当用户点击按钮时,该片段应该被另一个片段替换。当我点击按钮时,我遇到的问题是另一个片段低于当前片段。
截图
MainActivity
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();
}
}
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();
}
}
FragmentTwo.Class
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();
}
}
activity_main
<?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>
在您的 MainActivity
中使用此代码
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 所建议的,在您的 activity 布局中使用 FrameLayout
而不是 fragment
并初始化代码中的第一个片段。
布局:
<FrameLayout
android:id="@+id/fragment_place"
android:layout_width="match_parent"
android:layout_height="match_parent" />
代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment fr = new FragmentOne();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
}
//主要activity
<?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 fr = new FragmentOne();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
// 在下一个片段中必须采用相同的方式
我在片段中遇到了麻烦。我有两个片段,两个片段都包含列表。我正在做的是当用户点击按钮时,该片段应该被另一个片段替换。当我点击按钮时,我遇到的问题是另一个片段低于当前片段。
截图
MainActivity
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();
}
}
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();
}
}
FragmentTwo.Class
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();
}
}
activity_main
<?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>
在您的 MainActivity
中使用此代码 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 所建议的,在您的 activity 布局中使用 FrameLayout
而不是 fragment
并初始化代码中的第一个片段。
布局:
<FrameLayout
android:id="@+id/fragment_place"
android:layout_width="match_parent"
android:layout_height="match_parent" />
代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment fr = new FragmentOne();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
}
//主要activity
<?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 fr = new FragmentOne();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
// 在下一个片段中必须采用相同的方式