从微调器中选择项目时无限循环

时间:2017-07-30 20:57:22

标签: android

我有一个语言微调器,当选择相应的语言时,set.locale会改变应用程序的语言。但是,当单击微调器内的元素时,我得到一个无限循环,并且它会在语言一直改变后刷新活动。我想当选择项目时,它会无限次地读取所选项目。什么是错误以及如何解决问题?谢谢

package com.example.mher.citygo;

import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.DisplayMetrics;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.Spinner;

    import java.util.ArrayList;
    import java.util.Locale;

    public class MainActivity extends AppCompatActivity {

        String[] items;
        private static final int REQUEST_CALL=1;
        ArrayList<String> listItems;
        ArrayAdapter<String> adapter;
        ListView listView;
        EditText editText;
        Button bregister;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            ArrayList<ItemData> list=new ArrayList<>();
            list.add(new ItemData("Eng",R.drawable.usaflag));
            list.add(new ItemData("Arm",R.drawable.armeniaflag));
            list.add(new ItemData("Ru",R.drawable.russiaflag));
            list.add(new ItemData("Per",R.drawable.iranflag));
            Spinner sp=(Spinner) findViewById(R.id.spinner);
            SpinnerAdapter adapter=new SpinnerAdapter(this,R.layout.spinner_layout,R.id.txt,list);
            sp.setAdapter(adapter);

            sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    if(position==0)
                        setLocale("ru");
                }

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

                }
            });





            final Button SearchARid=(Button) findViewById(R.id.bSearchRide);
            Button LoginDriver=(Button) findViewById(R.id.bLogin_As_A_Driver);
            bregister=(Button) findViewById(R.id.bRegister);



            bregister.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent SignUp=new Intent(MainActivity.this,RegisterActivity.class);
                    MainActivity.this.startActivity(SignUp);

                }
            });

            LoginDriver.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent DriverLogin=new Intent(MainActivity.this,LoginActivity.class);
                    MainActivity.this.startActivity(DriverLogin);
                }
            });

            SearchARid.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent SearchRide=new Intent(MainActivity.this, SearchRide.class);
                    MainActivity.this.startActivity(SearchRide);
                }
            });
        }
        public void setLocale(String lang) {
            Locale myLocale = new Locale(lang);
            Resources res = getResources();
            DisplayMetrics dm = res.getDisplayMetrics();
            Configuration conf = res.getConfiguration();
            conf.locale = myLocale;
            res.updateConfiguration(conf, dm);
            Intent refresh = new Intent(this, MainActivity.class);
            startActivity(refresh);
            finish();
        }
    }

2 个答案:

答案 0 :(得分:1)

onItemSelected()不仅在用户进行选择时被调用。当任何进行选择时调用它,其中包括设置默认选择。 Spinner始终有选择;如果您没有另外指定,Spinner会选择适配器中的第一项。

在您的情况下,您通过销毁并重新创建活动来响应onItemSelected(),这会触发对onItemSelected()的调用,该调用会销毁并重新创建活动,从而触发对onItemSelected()的调用等等。

您需要忽略第一个onItemSelected()事件,该事件将设置初始选择。第二个事件(如果有的话)将来自用户。

答案 1 :(得分:0)

setOnItemSelectedListener之前,您可以写以下行来解决问题

// prevent go to OnItemSelectedListener on create activity, ONLY when user select
sp.setSelection(0,false);