Проблема с onItemSelected счетчик в android - PullRequest
2 голосов
/ 27 января 2020

Я хочу изменить язык своего приложения выбранным прядильщиком, но сначала не меняйте. После двухкратного выбора все заработало. Я заставляю использовать setOnTouchListener, потому что без этого происходят l oop. Это работало, но после много раз выберите.

Это мой код:

 boolean spinnerTouch=false;
                    Spinner s1;
                     @Override
                        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                                    if (spinnerTouch) {
                                    String text = parent.getItemAtPosition(position).toString();
                                    if (text.equals(getString(R.string.persian))) {

                                        lang = getResources().getString(R.string.lang_fa);
                                        country = getResources().getString(R.string.country_ir);
                                        onConfigurationChanged(new Configuration());



                                    } else if (text.equals(getString(R.string.english))) {
                                        lang = getResources().getString(R.string.lang_en);
                                        country = getResources().getString(R.string.country_us);
                                        onConfigurationChanged(new Configuration());



                                    }
                                    Utility.setPreferences(this, getResources().getString(R.string.lang), lang);
                                    Utility.setPreferences(this, getResources().getString(R.string.country), country);
                                    spinnerTouch = false;
                                }


                        }

                     protected void onCreate(Bundle savedInstanceState) {
                            super.onCreate(savedInstanceState);
                            setContentView(R.layout.activity_main);
                            btnLogin=(Button)findViewById(R.id.btnLogin);
                            btnLogin.setOnClickListener(this);

                            s1 = (Spinner) findViewById(R.id.spnLang);
                            s1.setOnItemSelectedListener(this);

                        s1.setOnTouchListener(new View.OnTouchListener() {
                            @Override
                            public boolean onTouch(View v, MotionEvent event) {
                                spinnerTouch= true;
                                return false;
                            }
                        });
           @Override
            public void onConfigurationChanged(Configuration newConfig){

                super.onConfigurationChanged(newConfig);
                if (lang != null){
                    Utility.languageHelper(lang,country,newConfig,getBaseContext().getResources());
                    recreate();
                }
            }
        public class Utility {

            public static void languageHelper(String lang, String country, Configuration config, Resources resources) {
                Locale locale = new Locale(lang,country);
                config.locale = locale;
                Locale.setDefault(locale);
                resources.updateConfiguration(config, resources.getDisplayMetrics());
            }

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Добавить ниже ConfiguratiojChange Класс

public class ConfigurationChange
{

    /**
     * Author:Hardik Talaviya
     * Date:  2019.08.3 2:30 PM
     * Describe:
    */

    private Context context;
    String lang = "EN";
    private Locale locale = null;

    public ConfigurationChange(Context context) {

        this.context = context;

    }

    public ContextWrapper changeLang(Context context,String lang)
    {
        this.context = context;

        Configuration config = context.getResources().getConfiguration();

        if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) {

            locale = new Locale(lang);
            Locale.setDefault(locale);
            Configuration conf = new Configuration(config);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
            {
                conf.setLocale(locale);
            }else
            {
                conf.locale = locale;
            }

            context.getResources().updateConfiguration(conf, context.getResources().getDisplayMetrics());
        }

        return new ContextWrapper(context);
    }
}

Теперь добавьте ниже код в вашей деятельности

private boolean isFirstTime = true;

//add below into onCreate
language_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

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

        if (isFirstTime)
            isFirstTime = false;
        else {

            ConfigurationChange configurationChange = new ConfigurationChange(YourActivity.this);
            configurationChange.changeLang(YourActivity.this,yourSelectedLanguageCode);//pass selected language code like "EN","FR" etc.

            Intent intent = getIntent();
            finish();
            startActivity(intent);

        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
});

Я надеюсь, что это может помочь Вам!

Спасибо.

0 голосов
/ 27 января 2020

Пожалуйста, попробуйте это,

  String[] weeks = {"Sunday", "Monday", "Tuesday", "Wednesday", "thursday"};

 public synchronized void showOptionDialogFilter(String title, final List<String> itemList, final FilterPreferenceListener optionSelected) {
    // setup the alert builder
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(Html.fromHtml("<b>" + title + "</b>"));// bold style of  title of dialog
    String[] listData = new String[itemList.size()];
    listData = itemList.toArray(listData);
    // add a list
    builder.setItems(listData, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            optionSelected.selectedItem(itemList.get(which),which);
        }
    });
    // create and show the alert dialog
    AlertDialog dialog = builder.create();
    dialog.show();
}

по щелчку счетчика, называемого spinnerSelect

public void spinnerSelect() {
    showOptionDialogFilter("Select Value", Arrays.asList(weeks), new FilterPreferenceListener() {
        @Override
        public void selectedItem(String item,int position) {
            editText.setText(item);

        }
    });
}

Используйте интерфейсный обратный вызов для результата

 public interface FilterPreferenceListener {
    void selectedItem(String item,int pos);
   }
...