2017-02-05 1 views
2

Mon application était presque complète quand j'ai réalisé que j'avais besoin d'utiliser des fragments plutôt que des activités pour partager le même Menu de Navigation sur tous les écrans, alors maintenant je suis en train de faire toute mon activité. en fragments. Un problème que je n'arrive pas à comprendre est le fileur qui change le langage. J'ai les chaînes anglaises (par défaut), espagnoles (ES) et françaises (FR) faites et traduites. Quand quelqu'un sélectionne l'espagnol sur le spinner je veux qu'il change les paramètres régionaux de l'application en espagnol (es) & faire un toast qui dit Language a changé en espagnol!, Etc. Pour ce faire, il doit redémarrer le fragment, correct? Commençons donc à fragmenter les paramètres depuis le fragment de paramètres afin que le langage se mette à jour En ce moment, quand je sélectionne une option du spinner je peux voir que je l'ai sélectionné sur le spinner, mais rien ne se passe. Pas de pain grillé, pas de langue, pas de rafraîchissement du fragment, etc. Toute aide est très appréciée! Je vous remercie!! Je posterai le code ci-dessous!Comment faire un fileur (dans un fragment) qui change la langue de l'application?

package com.ezeapplications.quikflipfinal; 
 

 

 
import android.content.Intent; 
 
import android.content.res.Configuration; 
 
import android.content.res.Resources; 
 
import android.os.Bundle; 
 
import android.support.annotation.Nullable; 
 
import android.support.v4.app.Fragment; 
 
import android.support.v4.app.FragmentActivity; 
 
import android.support.v4.app.FragmentTransaction; 
 
import android.util.DisplayMetrics; 
 
import android.view.LayoutInflater; 
 
import android.view.View; 
 
import android.view.ViewGroup; 
 
import android.widget.AdapterView; 
 
import android.widget.ArrayAdapter; 
 
import android.widget.Button; 
 
import android.widget.Spinner; 
 
import android.widget.Toast; 
 

 
import java.util.Locale; 
 
import java.util.Set; 
 

 

 
/** 
 
* A simple {@link Fragment} subclass. 
 
*/ 
 
public class SettingsFragment extends Fragment implements View.OnClickListener, AdapterView.OnItemSelectedListener { 
 

 
    public SettingsFragment() { 
 
     // Required empty public constructor 
 
    } 
 

 
    @Override 
 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
 
     View view = inflater.inflate(R.layout.fragment_settings, container, false); 
 
     Button settupdatebtn = (Button) view.findViewById(R.id.setting_update_btn); 
 
     settupdatebtn.setOnClickListener(this); 
 

 
     Spinner langspinner = (Spinner) view.findViewById(R.id.settings_language_spinner); 
 
     // Create an ArrayAdapter using the string array and a default spinner layout 
 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), 
 
       R.array.lang_array, android.R.layout.simple_spinner_item); 
 
     // Specify the layout to use when the list of choices appears 
 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
 
     // Apply the adapter to the spinner 
 
     langspinner.setAdapter(adapter); 
 
     return view; 
 
    } 
 

 
    @Override 
 
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
 

 
     Spinner langspinner = (Spinner) view.findViewById(R.id.settings_language_spinner); 
 
     langspinner.setOnItemSelectedListener(this); 
 

 
     if (pos == 1) { 
 

 
      Toast.makeText(parent.getContext(), 
 
        "You Have Selected English!", Toast.LENGTH_SHORT) 
 
        .show(); 
 
      setLocale("en"); 
 
      SettingsFragment fragmenten = new SettingsFragment(); 
 
      android.support.v4.app.FragmentTransaction fragmentTransactionen = 
 
        getActivity().getSupportFragmentManager().beginTransaction(); 
 
      fragmentTransactionen.replace(R.id.fragment_container, fragmenten); 
 
      fragmentTransactionen.commit(); 
 
      langspinner.setSelection(1); 
 

 
     } else if (pos == 2) { 
 

 
      Toast.makeText(parent.getContext(), 
 
        "Has Seleccionado Español!", Toast.LENGTH_SHORT) 
 
        .show(); 
 
      setLocale("es"); 
 
      SettingsFragment fragmentes = new SettingsFragment(); 
 
      android.support.v4.app.FragmentTransaction fragmentTransactiones = 
 
        getActivity().getSupportFragmentManager().beginTransaction(); 
 
      fragmentTransactiones.replace(R.id.fragment_container, fragmentes); 
 
      fragmentTransactiones.commit(); 
 
      langspinner.setSelection(2); 
 

 
     } else if (pos == 3) { 
 

 
      Toast.makeText(parent.getContext(), 
 
        "Vous Avez Sélectionné Le Français!", Toast.LENGTH_SHORT) 
 
        .show(); 
 
      setLocale("fr"); 
 
      SettingsFragment fragmentfr = new SettingsFragment(); 
 
      android.support.v4.app.FragmentTransaction fragmentTransactionfr = 
 
        getActivity().getSupportFragmentManager().beginTransaction(); 
 
      fragmentTransactionfr.replace(R.id.fragment_container, fragmentfr); 
 
      fragmentTransactionfr.commit(); 
 
      langspinner.setSelection(3); 
 
     } 
 
    } 
 

 
    public void onNothingSelected(AdapterView<?> arg0) { 
 
     // TODO Auto-generated method stub 
 
    } 
 

 

 
     @Override 
 
       public void onClick (View v) { 
 
      SettingsFragment fragment = new SettingsFragment(); 
 
      android.support.v4.app.FragmentTransaction fragmentTransaction = 
 
        getFragmentManager().beginTransaction(); 
 
      fragmentTransaction.replace(R.id.fragment_container,fragment); 
 
      fragmentTransaction.commit(); 
 
      Toast.makeText(getActivity(), "Settings Updated!", Toast.LENGTH_SHORT).show(); 
 
     }; 
 

 
    Locale myLocale; 
 
    public void setLocale(String lang) { 
 
     myLocale = new Locale(lang); 
 
     Locale.setDefault(myLocale); 
 
     Resources res = getResources(); 
 
     DisplayMetrics dm = res.getDisplayMetrics(); 
 
     Configuration conf = res.getConfiguration(); 
 
     conf.locale = myLocale; 
 
     res.updateConfiguration(conf, dm); 
 
     refresh(); 
 

 

 
} 
 

 
public void refresh() { 
 
    Fragment currentFragment = getFragmentManager().findFragmentByTag("fragment_tag_String"); 
 
    FragmentTransaction fragTransaction = getFragmentManager().beginTransaction(); 
 
    fragTransaction.detach(currentFragment); 
 
    fragTransaction.attach(currentFragment); 
 
    fragTransaction.commit(); 
 

 
} 
 

 
    }

Répondre

0

Vous pouvez simplement détacher et attacher vos fragments. Ensuite, il rafraîchira les vues et le local sera changé.

Fragment currentFragment = getFragmentManager().findFragmentByTag("FRAGMENT"); 
FragmentTransaction fragTransaction = getFragmentManager().beginTransaction(); 
fragTransaction.detach(currentFragment); 
fragTransaction.attach(currentFragment); 
fragTransaction.commit(); 

Définissez fragmentTag pour SettingsFragment dans MainActivity où vous avez appelé ce fragment. (ex: méthode OnNavigationItemSelected()).

FragmentManager fm = getFragmentManager(); 
fm.beginTransaction().replace(R.id.content_frame, new YourSettingsFragment(),"Tag").commit(); 
+0

Ne fonctionne toujours pas. J'ai fait quelques changements, donc je vais mettre à jour le post. – CoolBeener

0

essayez ceci:

public class SettingsFragment extends Fragment implements View.OnClickListener, AdapterView.OnItemSelectedListener { 

    Spinner langspinner; 

    public SettingsFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_settings, container, false); 
     Button settupdatebtn = (Button) view.findViewById(R.id.setting_update_btn); 
     settupdatebtn.setOnClickListener(this); 

     langspinner = (Spinner) view.findViewById(R.id.settings_language_spinner); 
     langspinner.setOnItemSelectedListener(this); 
     // Create an ArrayAdapter using the string array and a default spinner layout 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), 
       R.array.lang_array, android.R.layout.simple_spinner_item); 
     // Specify the layout to use when the list of choices appears 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     // Apply the adapter to the spinner 
     langspinner.setAdapter(adapter); 
     langspinner.setSelection(0, false); 
     return view; 
    } 

    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 

     if (pos == 1) { 

      Toast.makeText(parent.getContext(), 
        "You Have Selected English!", Toast.LENGTH_SHORT) 
        .show(); 
      setLocale("en"); 
      langspinner.setSelection(1); 

     } else if (pos == 2) { 

      Toast.makeText(parent.getContext(), 
        "Has Seleccionado Español!", Toast.LENGTH_SHORT) 
        .show(); 
      setLocale("es"); 
      langspinner.setSelection(2); 

     } else if (pos == 3) { 

      Toast.makeText(parent.getContext(), 
        "Vous Avez Sélectionné Le Français!", Toast.LENGTH_SHORT) 
        .show(); 
      setLocale("fr"); 
      langspinner.setSelection(3); 
     } 
    } 

    public void onNothingSelected(AdapterView<?> arg0) { 
     // TODO Auto-generated method stub 
    } 


    @Override 
    public void onClick(View v) { 
     SettingsFragment fragment = new SettingsFragment(); 
     android.support.v4.app.FragmentTransaction fragmentTransaction = 
       getFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.fragment_container, fragment); 
     fragmentTransaction.commit(); 
     Toast.makeText(getActivity(), "Settings Updated!", Toast.LENGTH_SHORT).show(); 
    } 


    Locale myLocale; 

    public void setLocale(String lang) { 
     myLocale = new Locale(lang); 
     Locale.setDefault(myLocale); 
     Resources res = getResources(); 
     DisplayMetrics dm = res.getDisplayMetrics(); 
     Configuration conf = res.getConfiguration(); 
     conf.locale = myLocale; 
     res.updateConfiguration(conf, dm); 
     refresh(); 


    } 

    public void refresh() { 
     Fragment currentFragment = getFragmentManager().findFragmentByTag("fragment_tag_String"); 
     FragmentTransaction fragTransaction = getFragmentManager().beginTransaction(); 
     fragTransaction.detach(currentFragment); 
     fragTransaction.attach(currentFragment); 
     fragTransaction.commit(); 

    } 

} 

Assurez-vous que lorsque vous chargez le SettingsFragment de votre activity u ajouter la balise Fragment

Comme cela;

SettingsFragment fragmentA = new SettingsFragment(); 
getSupportFragmentManager().beginTransaction() 
    .replace(R.id.MainFrameLayout,fragmentA,"fragment_tag_String") 
    .addToBackStack(null).commit(); 
+0

Ne fonctionne toujours pas. A fait quelques changements cependant. Je vais mettre à jour le code en post. – CoolBeener

+0

@CoolBeener vérifier la réponse éditée .. – rafsanahmad007

+0

J'ai ajouté cela, et maintenant le fileur montre la langue sélectionnée, et le change! Le seul problème est le fait qu'il est constamment en train de faire une nouvelle mise à jour du langage toast. dès que l'on commence à s'estomper, on en fait un nouveau. Merci!! J'espère que vous pouvez aider! – CoolBeener