Не продолжайте работу до тех пор, пока не будет обработан диалог - PullRequest
0 голосов
/ 31 августа 2018

Я показываю диалоговое окно с предупреждением только один раз, когда приложение установлено. В диалоговом окне предупреждения пользователь должен выбрать страну, которая хранится в переменной, прежде чем приложение загрузит данные в соответствии с выбранной страной. Я хочу, чтобы он дождался обработки диалогового окна с предупреждением, прежде чем продолжить ... Ниже приведен мой код

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    isFirstTime();
    initialize();
}

private void isFirstTime() {
    SharedPreferences preferences = getPreferences(MODE_PRIVATE);
    boolean ranBefore = preferences.getBoolean("RanBefore", false);
    if (ranBefore == false) {
        String[] countries = getResources().getStringArray(R.array.countries);
        final String[] countriesCode = getResources().getStringArray(R.array.countries_code);
        AlertDialog.Builder mBuilder = new AlertDialog.Builder(this);
        mBuilder.setTitle("Choose country");
        mBuilder.setSingleChoiceItems(countries, -1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                String selectedCountry = countriesCode[i];
                int selectedCountryIndex = i;
                SharedPreferences sharedPref = getSharedPreferences("country", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.putString("selectedCountry", selectedCountry);
                editor.putInt("selectedCountryIndex", selectedCountryIndex);
                editor.apply();
                dialogInterface.dismiss();

            }
        });
        mBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        AlertDialog mDialog = mBuilder.create();
        mDialog.show();

        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean("RanBefore", true);
        editor.apply();

    }

}


private void initialize(){
    setContentView(R.layout.activity_main);
    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    NavigationDrawer navigationDrawer_fragment =
            (NavigationDrawer) getSupportFragmentManager().findFragmentById(R.id.mainfragmentdrawer);
    navigationDrawer_fragment.setup((DrawerLayout) findViewById(R.id.drawer_layout), toolbar);


    final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.addTab(tabLayout.newTab().setText("Latest"));
    tabLayout.addTab(tabLayout.newTab().setText("Categories"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    viewPager = (ViewPager) findViewById(R.id.pager);
    adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.setOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018
public static final String COUNTRYSETTINGS = "countrySettings";
private static final String SHOWCNTRYDIALOG = "countryDialog";
Boolean showCountryDialog = false;
//keep a boolean which you set from the sharedpref 

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   SharedPreferences pref = getSharedPreferences(COUNTRYSETTINGS, 0);

   if(!pref.contains(SHOWCNTRYDIALOG)){
       pref.edit().putBoolean(SHOWCNTRYDIALOG, false).apply();
       showCountryDialog = true;
   }else{
       showCountryDialog = pref.getBoolean(SHOWCNTRYDIALOG, true);
   }
   if(showCountryDialog){
       createCountryDialog();
   }
}   
public void createCountryDialog(){
  //Handle your setting country related stuff
  if(postive_option)
     checkCountryAndLoadDataAcc();
}

Создайте переменную в разделяемом префе, с помощью которой вы будете показывать диалог только при первой установке приложения (showCountryDialog) и с помощью которого вы вызываете функцию диалога, в которой вы можете проверить местоположение и вызвать свою загрузку работать дальше оттуда.

0 голосов
/ 31 августа 2018

Вы можете изменить

private void isFirstTime() {

В

private bool isFirstTime() {

И добавить возвращаемое значение, основанное на ответе пользователя на диалоговое окно, которое затем возвращается из функции в конце.

И гнездо инициализируется внутри:

if (isFirstTime()) {
   initialize();
}

Не ждет? Хм, какой из диалогов это?

...