Android 保存碎片的状态?

Android 保存碎片的状态?,android,android-studio,android-fragments,bottomnavigationview,onsaveinstancestate,Android,Android Studio,Android Fragments,Bottomnavigationview,Onsaveinstancestate,我正在尝试实现多个片段。每个片段都在活动中查看,当我单击底部导航按钮时,活动会发生更改或被替换。 我们能够将数据从frag1传递到frag2,但是,如果我单击frag2或任何其他片段按钮,导航栏(即此处的流栏)将重置,数据将丢失 以下是我自己尝试过的:我在第二个片段中实现了onSaveInstanceState,但是没有任何用处。不知怎的,这个片段是新创建的 还尝试了上述解决方案 这里是布局图 主要活动 import android.graphics.drawable.Drawable; im

我正在尝试实现多个片段。每个片段都在活动中查看,当我单击底部导航按钮时,活动会发生更改或被替换。 我们能够将数据从frag1传递到frag2,但是,如果我单击frag2或任何其他片段按钮,导航栏(即此处的流栏)将重置,数据将丢失

以下是我自己尝试过的:我在第二个片段中实现了onSaveInstanceState,但是没有任何用处。不知怎的,这个片段是新创建的

还尝试了上述解决方案

这里是布局图

主要活动

import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.br.tron.bottombar.RadioFragment;
import com.br.tron.bottombar.StreamFragment;
import com.br.tron.bottombar.InfoFragment;

public class MainActivity extends AppCompatActivity implements PushStreamLink{

    BottomNavigationView bottomNavigationView;
    private Fragment fragment;
    private FragmentManager fragmentManager;
    View view;
    //private FragmentTransaction transaction;

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

        fragmentManager = getSupportFragmentManager();
        fragment = new RadioFragment();
        fragment.setRetainInstance(true);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.main_container, fragment).commit();

        bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNavigationBar);
        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener(){
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                String tag = "";
                switch (item.getItemId()) {
                    case R.id.nav_button_one:
                        fragment = new RadioFragment();
                        fragment.setRetainInstance(true);

                        tag = "radio_fragment";
                        break;
                    case R.id.nav_button_two:
                        fragment = new StreamFragment();
                        fragment.setRetainInstance(true);

                        tag = "stream_fragment";
                        break;
                    case R.id.nav_button_three:
                        fragment = new InfoFragment();
                        fragment.setRetainInstance(true);

                        tag = "info_fragment";
                        break;
                }
                FragmentTransaction transaction = fragmentManager.beginTransaction();
                transaction.replace(R.id.main_container, fragment, tag).commit();

                return true;
            }
        });
    }

    @Override
    public void sendStreamLink(String link) {
        fragment =new StreamFragment();
        fragment.setRetainInstance(true);
        fragmentManager=getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.main_container, fragment,"stream_fragment").addToBackStack(null).commit();
        getSupportFragmentManager().executePendingTransactions();
        StreamFragment sf=(StreamFragment) getSupportFragmentManager().findFragmentByTag("stream_fragment");
        sf.getUrl(link);
        view = bottomNavigationView.findViewById(R.id.nav_button_two);
        view.performClick();
    }
}
RadioFragment(我从中发送数据的碎片)

StreamFragment(接收数据但未保存在视图中的frag)

而不是

 case R.id.nav_button_three:
                            fragment = new InfoFragment();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
                    transaction.replace(R.id.main_container, fragment, tag).commit();
创建实例,例如:

private FragmentManager fragmentManager;
private MyFragment myFragment;
fragmentManager = getFragmentManager();
myFragment = new MyFragment();
在MainActivity OnCreate()方法上创建片段管理器和所有片段,例如:

private FragmentManager fragmentManager;
private MyFragment myFragment;
fragmentManager = getFragmentManager();
myFragment = new MyFragment();
然后添加方法:

public void loadFragment(Fragment fragment) {
        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, fragment)
                .addToBackStack(null)
                .commit();
    }
然后单击“加载所需片段”:

case R.id.nav_button_three:
loadFragment(myFragment);
而不是

 case R.id.nav_button_three:
                            fragment = new InfoFragment();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
                    transaction.replace(R.id.main_container, fragment, tag).commit();
创建实例,例如:

private FragmentManager fragmentManager;
private MyFragment myFragment;
fragmentManager = getFragmentManager();
myFragment = new MyFragment();
在MainActivity OnCreate()方法上创建片段管理器和所有片段,例如:

private FragmentManager fragmentManager;
private MyFragment myFragment;
fragmentManager = getFragmentManager();
myFragment = new MyFragment();
然后添加方法:

public void loadFragment(Fragment fragment) {
        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, fragment)
                .addToBackStack(null)
                .commit();
    }
然后单击“加载所需片段”:

case R.id.nav_button_three:
loadFragment(myFragment);

所以你是说我应该分别为这三个片段创建实例??你的解决方案给了我类强制转换异常错误java.lang.ClassCastException:com.br.tron.bottombar.RadioFragment不能强制转换为com.br.tron.bottombar.StreamFragments,而不是fragmentManager=getFragmentManager();使用fragmentManager=getSupportFragmentManager();因为正如我看到的,你改进了这一点:导入android.support.v4.app.Fragment;如果您可以看到我已经在使用fragmentManager=getSupportFragmentManager()的代码;我的实现中没有错误。。。只是片段的前一个状态没有得到恢复,所以你是说我应该分别为所有三个片段创建实例??你的解决方案给了我类强制转换异常错误java.lang.ClassCastException:com.br.tron.bottombar.RadioFragment不能强制转换为com.br.tron.bottombar.StreamFragments,而不是fragmentManager=getFragmentManager();使用fragmentManager=getSupportFragmentManager();因为正如我看到的,你改进了这一点:导入android.support.v4.app.Fragment;如果您可以看到我已经在使用fragmentManager=getSupportFragmentManager()的代码;我的实现中没有错误。。。只是碎片之前的状态没有恢复一些人能帮我吗?一些人能帮我吗?