如何制作一个可以改变应用程序语言的微调框(片段)? [英] How to Make a Spinner (In a Fragment) That Changes the App's Language?

查看:47
本文介绍了如何制作一个可以改变应用程序语言的微调框(片段)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我意识到我需要使用片段而不是活动以便在所有屏幕上共享相同的导航菜单时,我的应用程序几乎完全完成,所以现在我正在制作所有活动Java代码零碎地工作.我似乎无法弄清的一个问题是更改语言的微调器.我制作并翻译了英语(默认),西班牙语(ES)和法语(FR)字符串.当有人在微调框上选择西班牙语时,我希望它将应用程序的语言环境更改为西班牙语(es)&举杯,说语言更改为西班牙语!等.为此,它必须重新启动该片段,对吗?那么从设置片段开始设置片段,以便语言更新?现在,当我从微调器中选择一个选项时,可以看到我在微调器上选择了它,但是什么也没有发生.没有吐司,没有语言,没有片段的刷新,等等.非常感谢所有帮助!谢谢!!我将在下面发布代码!

My app was almost fully complete when I realized I needed to use fragments instead of activities in order to share the same Navigation Menu across all of the screens, so now I'm in the process of making all of my activity java code work in fragments. One issue that I can't seem to figure out is the spinner that changes the language. I have the English (Default), Spanish (ES), and French (FR) strings made and translated. When someone selects Spanish on the spinner I want it to change the app's locale to Spanish (es) & make a toast that says Language changed to Spanish!, etc. In order to do this, it must restart the fragment, correct? So begin settings fragment from settings fragment so the language updates? Right now, when I select an option from the spinner I can see that I selected it on the spinner, but nothing happens. No toast, no language, no refresh of the fragment, etc. All help is very much appreciated! Thank you!! I will post code below!

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

}

    }

推荐答案

尝试一下:

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

    }

}

确保从activity加载SettingsFragment时添加Fragment标签

Make sure when you load the SettingsFragment from your activity u add the Fragment tag

喜欢这个

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

这篇关于如何制作一个可以改变应用程序语言的微调框(片段)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆