1

J'essaie d'implémenter plusieurs fragments. Chaque fragment est visualisé dans une activité qui change ou est remplacée quand je clique sur mon bouton de navigation inférieur. J'ai été capable de passer les données de frag1 à frag2, cependant si je clique sur frag2 ou n'importe quel autre bouton de fragment, la barre de navigation est ici réinitialisée et les données sont perdues.Préserver l'état des fragments?

Voici ce que j'ai essayé par moi-même: j'ai implémenté onSaveInstanceState dans le second fragment, mais inutile. D'une manière ou d'une autre, le fragment est nouvellement créé.

également essayé la solution mentionnée here

Juste une idée ici est la mise en page 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 (Frag dont je vous envoie des données)

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 auquel les données sont reçues, mais ne reçoit pas enregistré dans vue)

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); 
     } 
    } 
} 
+0

certains peuvent me s'il vous plaît aider? –

Répondre

0

au lieu de

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

créer des instances, par exemple:

private FragmentManager fragmentManager; 
private MyFragment myFragment; 

créer gestionnaire de Fragment et tous vos fragments sur la méthode MainActivity OnCreate(), par exemple:

fragmentManager = getFragmentManager(); 
myFragment = new MyFragment(); 

puis ajouter la méthode:

public void loadFragment(Fragment fragment) { 
     fragmentManager.beginTransaction() 
       .replace(R.id.content_frame, fragment) 
       .addToBackStack(null) 
       .commit(); 
    } 

et après un clic charger le fragment que vous voulez:

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

donc vous dites que je devrais créer des instances pour tous les trois fragments séparément? –

+0

votre solution me donne une erreur d'exception de distribution de classe java.lang.ClassCastException: com.br.tron.bottombar.RadioFragment ne peut pas être converti en com.br.tron.bottombar.StreamFragment –

+0

Au lieu de fragmentManager = getFragmentManager(); use fragmentManager = getSupportFragmentManager(); parce que je vois que vous avez imprimé ceci: import android.support.v4.app.Fragment; –