在Fragment1上我有onClick方法,当我点击按钮时,我得到了recycleview项目列表。当我单击recycleview中的项目(使用getPlaceFromItem方法)时,我转到Fragment2。如果设备是电话然后把 容器1中的Fragment2,但如果设备是平板电脑(横向),那么我将Fragment2放入container1中Fragment1旁边的container2。
现在,当设备是手机时我按回按钮,我得到空的recycleview。
此外,我检查屏幕的方向,当设备是电话时,我在Fragment2(即容器1中的Fragment2),然后当屏幕将是横向时,我将放入container1 Fragment1,并进入Fragment2的container2。我的问题是如何从container1切割Fragment2并将其放入container2。
主要活动:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
View v = findViewById(R.id.container2);
v.setVisibility(View.GONE);
getSupportFragmentManager().beginTransaction()
.add(R.id.container1, new FragmentA())
.commit();
}
@Override
public void getPlaceFromItem(Place place) {
Bundle bundle = new Bundle();
bundle.putDouble("lat", place.getLat());
bundle.putDouble("lng", place.getLng());
Fragment2 fragment2 = new Fragment2();
fragment2.setArguments(bundle);
if(getResources().getBoolean(R.bool.isTab)) {
View v = findViewById(R.id.container2);
v.setVisibility(View.VISIBLE);
getSupportFragmentManager().beginTransaction()
.replace(R.id.container2,fragment2)
.addToBackStack(null)
.commit();
}
else {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container1, fragment2)
.addToBackStack(null)
.commit();
}
}
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
View v = findViewById(R.id.container2);
v.setVisibility(View.VISIBLE);
getSupportFragmentManager().beginTransaction()
.replace(R.id.container1, new Fragment1())
// The next row is a problematic!!!
.replace(R.id.container2, new Fragment2())
.commit();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
}
}
答案 0 :(得分:4)
请记住,当从后面的堆栈中弹出一个片段时,它会返回而没有任何视图。所以你必须再次附上视图。
我建议您跟踪片段中的主视图,以避免重新创建视图。这样一旦你回到使用RecyclerView的片段,它就会在那里。代码看起来像这样。
public class BlankFragment2 extends Fragment {
public View myRoot;
public BlankFragment2() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
if (myRoot == null) {
myRoot = inflater.inflate(R.layout.fragment_blank_fragment2, container, false);
}
return myRoot;
}
}
答案 1 :(得分:0)
.addToBackStack(null)将其从代码中删除
我希望它对你有用
答案 2 :(得分:0)
添加.addToBackStack(fragment.getClass().getCanonicalName())
或.addToBackStack("anyString")
以保存片段实例。当您添加新片段时,也请使用add
方法,而不是replace
。
答案 3 :(得分:0)
当您添加第一个片段时,不应使用addToBackStack(null)。
对于像这样的第一个片段写
getSupportFragmentManager().beginTransaction()
.add(R.id.container1, FragmentA)
.commit();
对于你应该使用的其他片段
getSupportFragmentManager().beginTransaction()
.replace(R.id.container1, FragmentB)
.addToBackStack(null)
.commit();
希望它有所帮助!