2016-12-28 21 views
1

从片段(设置)中通过按TextView调用DialogFragment,在其中更改设置(语言)应用程序,如何关闭DialogFragment,应用设置而不重新启动整个应用程序?Android在应用程序内切换语言而不重新启动

理想情况下,在SingleChoice选择对话框上一次更改语言。重启后一切正常。下面是代码DialogFragment

public class LanguageDialogFragment extends DialogFragment { 

    final String[] itemsLang = {"English", "Russian", "Ukraine"}; 
    final String[] items = {"en", "ru", "uk"}; 
    String lang; 
    MainActivity activity = new MainActivity(); 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle("Выберите свой родной язык") 
       .setSingleChoiceItems(itemsLang, -1, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int item) { 
         lang = items[item]; 

        } 
       }) 

       .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         App.prefs.saveLanguage(lang); 
         App.changeLang(lang); 

         reload(); 

        } 
       }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 

        } 
       }); 

     return builder.create(); 
    } 

    private void reload() { 
     Intent intent = getActivity().getIntent(); 
     getActivity().finish(); 
     Intent LaunchIntent = getActivity().getPackageManager().getLaunchIntentForPackage(App.context.getPackageName()); 
     startActivity(LaunchIntent); 
    } 
} 

下面是应用程序的例子,就像我想要实现:https://play.google.com/store/apps/details?id=com.funeasylearn.english

截图从中:

enter image description here enter image description here

回答

0

尝试代码下面。您必须根据用户选择的语言创建新的区域设置,将其设置为当前区域并重新启动您的活动。请注意,如果在执行区域设置切换时它们处于活动状态,则可能必须重新启动其他活动。

public class LanguageDialogFragment extends DialogFragment { 

    private final String[] itemsLang = {"English", "Russian", "Ukraine"}; 
    private final String[] items = {"en", "ru", "uk"}; 
    private String lang; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle("Выберите свой родной язык") 
      .setSingleChoiceItems(itemsLang, -1, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int item) { 
        lang = items[item]; 

       } 
      }).setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        //When user submits, restart the activity in 
        //the new language 
        restartActivityInLanguage(lang); 

       } 
      }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        //Do nothing 
       } 
      }); 

     return builder.create(); 
    } 

    private void restartActivityInLanguage(String language) { 
     Locale locale = new Locale(language); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     Resources resources = getResources(); 
     resources.updateConfiguration(config, resources.getDisplayMetrics()); 
     getActivity().recreate(); 
    } 
} 
+0

不是一个完美的解决方案,应用类的静态变量和JNI库将不会重新初始化.. – blueware

+0

我不想becasue程序是做这样的记录屏幕一些任务重新启动我的应用程序。所以没有重新启动应用程序是有任何解决方案的Android 7.0 – PriyankaChauhan

相关问题