从片段反向按下时,recyclerview为空

时间:2017-08-01 07:17:55

标签: android android-fragments android-recyclerview recycler-adapter

在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){
 }      
    }

4 个答案:

答案 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();
希望它有所帮助!