保留碎片的状态?

时间:2017-01-08 11:43:52

标签: android android-studio android-fragments bottomnavigationview onsaveinstancestate

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

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

还尝试了提到here

的解决方案

这里只是一个想法是布局 enter image description here

MainActivity

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(我发送数据的片段)

import android.app.Activity;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

/**
 * Created by Tron on 1/5/2017.
 */

public class RadioFragment extends Fragment implements Button.OnClickListener  {

    Button buttonman;
    View rootView;
    PushStreamLink pushStreamLink;
    Activity a;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        if (context instanceof Activity) {
            //a = (Activity) context;
        }
        if (context instanceof PushStreamLink) {
            pushStreamLink = (PushStreamLink) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }

    }

    public RadioFragment(){
    };

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

        rootView = inflater.inflate(R.layout.fragment_player, container, false);
        buttonman = (Button)rootView.findViewById(R.id.buttonman);
        buttonman.setOnClickListener(this);
        return rootView;
    }

    @Override
    public void onClick(View v) {
        /*Fragment fragment = new StreamFragment();
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.main_container, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();*/
        //((MainActivity)a).performStreamClick();
        pushStreamLink.sendStreamLink("www.zz.com");
    }
}

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

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


/**
 * Created by Tron on 1/5/2017.
 */

public class StreamFragment extends Fragment {

    String streamUrl="NoLinkFound";
    TextView textView;
    public StreamFragment(){};

    @Override
    public View onCreateView( LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.fragment_stream, container, false);
        if(savedInstanceState==null)
        {

        }
        else
        {
            streamUrl=savedInstanceState.getString("CurrentStreamLink");
            textView =(TextView) getActivity().findViewById(R.id.streamLinkTextView);
            textView.setText(streamUrl);
        }
        return view;
    }

    @Override
    public void onSaveInstanceState(Bundle outState){
        outState.putString("CurrentStreamLink",streamUrl);
        super.onSaveInstanceState(outState);
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState){
        if (streamUrl!=null) {
//            streamUrl = savedInstanceState.getString("CurrentStreamLink");
            textView = (TextView) getActivity().findViewById(R.id.streamLinkTextView);
            textView.setText(streamUrl);
        }
        super.onActivityCreated(savedInstanceState);
    }

    public void getUrl(String data)
    {
        streamUrl=data;
        if (streamUrl!=null)
        {
            textView=(TextView) getActivity().findViewById(R.id.streamLinkTextView);
            textView.setText(streamUrl);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

而不是

 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;

在MainActivity OnCreate()方法上创建片段管理器和所有片段,例如:

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);