2014-01-08 4 views
1

Я использую этот code, чтобы создать всплывающее диалоговое окно в моей домашней деятельности, чтобы попросить пользователя оценить мое приложение, коды работают нормально, однако, когда пользователи выбирают параметр «Нет благодарности», диалог не следует показывать снова.Отключить всплывающее диалоговое окно после щелчка

Однако, когда приложение вновь, мой homeActivity перезагружается, все в нем сбрасывается, поэтому, несмотря на это

editor.putBoolean("dontshowagain", true); 
editor.commit(); 

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

public static class AppRater { 

    private final int DAYS_UNTIL_PROMPT = 3; 
    private final int LAUNCHES_UNTIL_PROMPT = 7; 

    public void app_launched(Context mContext) { 
     SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0); 
     if (prefs.getBoolean("dontshowagain", false)) { return ; } 

     SharedPreferences.Editor editor = prefs.edit(); 

     // Increment launch counter 
     long launch_count = prefs.getLong("launch_count", 0) + 1; 
     editor.putLong("launch_count", launch_count); 

     // Get date of first launch 
     Long date_firstLaunch = prefs.getLong("date_firstlaunch", 0); 
     if (date_firstLaunch == 0) { 
      date_firstLaunch = System.currentTimeMillis(); 
      editor.putLong("date_firstlaunch", date_firstLaunch); 
     } 

        // i just use this to test the dialog instantly 
      showRateDialog(mContext, editor); 



     // Wait at least n days before opening 
     if (launch_count >= LAUNCHES_UNTIL_PROMPT) { 
      if (System.currentTimeMillis() >= date_firstLaunch + 
        (DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000)) { 
       showRateDialog(mContext, editor); 
      } 
     } 

     editor.commit(); 
    } 

    public static void showRateDialog(final Context mContext, final SharedPreferences.Editor editor) { 
     final Dialog dialog = new Dialog(mContext); 
     dialog.setTitle("Rate MyApp"); 

     LinearLayout ll = new LinearLayout(mContext); 
     ll.setOrientation(LinearLayout.VERTICAL); 

     TextView tv = new TextView(mContext); 
     tv.setText("We see that you have been using MyApp well. Would you like to rate us?"); 
     tv.setWidth(240); 
     tv.setPadding(4, 0, 4, 10); 
     ll.addView(tv); 

     Button b1 = new Button(mContext); 
     b1.setText("Rate MyApp"); 
     b1.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Uri uri = Uri.parse("market://details?id=" + mContext.getPackageName()); 
       Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri); 
       try { 
        mContext.startActivity(goToMarket); // playstore installed 
       } catch (ActivityNotFoundException e) { // open website if not 
        mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + mContext.getPackageName()))); 
       } 
       dialog.dismiss(); 
      } 
     });   
     ll.addView(b1); 

     Button b2 = new Button(mContext); 
     b2.setText("Remind me later"); 
     b2.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       dialog.dismiss(); 
      } 
     }); 
     ll.addView(b2); 


     Button b3 = new Button(mContext); 
     b3.setText("No, thanks"); 
     b3.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       rated = true; 
       if (editor != null) { 
        editor.putBoolean("dontshowagain", true); 
        editor.commit(); 
       } 
       dialog.dismiss(); 
      } 
     }); 
     ll.addView(b3); 

     dialog.setContentView(ll);   
     dialog.show();  
    } 
} 
// http://www.androidsnippets.com/prompt-engaged-users-to-rate-your-app-in-the-android-market-appirater 

ответ

2

Приятная проблема. Я думаю, причина в том, что вы завершаете editor в конце метода app_launched, а кнопка в диалоговом окне происходит через некоторое время, поэтому, когда вы делаете это editor.putBoolean("dontshowagain", true), editor уже совершается, и, следовательно, ваша запись не сохраняется в предпочтения.

Если вам нужна помощь по изменению кода, чтобы исправить это, дайте мне знать в комментарии.

EDIT - Некоторый код

Во-первых, не передать редактору ваш метод showRateDialog, поэтому изменить метод подписи:

public static void showRateDialog(final Context mContext) 

Во-вторых, в методе onClick, создать новый редактор , напишите флаг и зафиксируйте.

public void onClick(View v) { 
    rated = true; 
    SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0); 
    // create editor, write stuff and commit, all in one line. 
    prefs.edit().putBoolean("dontshowagain", true).commit(); 
    dialog.dismiss(); 
} 
+0

Да, пожалуйста, на самом деле я попытался установить другое логическое значение и проверить, является ли это значение ложным, тогда я не вызову showRateDialog(), но он все еще не работает. – Casper

+0

Добавлен код и пояснения. Это должно заставить вас идти. – Ridcully

+0

Спасибо, я изменил свои коды, как вы предлагали, но диалог по-прежнему загружается после того, как я выхожу из приложения и снова его использую, btw Я назвал этот класс в методе onCreate из homeActivity 'AppRater.showRateDialog (this);' – Casper

1

Ridicully правильный. Используйте этот код вместо и открыть новый редактор:

b3.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     rated = true; 
     SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0); 
     SharedPreferences.Editor editorNew = prefs.edit(); 
     editorNew.putBoolean("dontshowagain", true); 
     editorNew.commit(); 

     dialog.dismiss(); 
    } 
}); 

Затем очистить вверх showRateDialog путем удаления параметра редактора. Помните, что код слушателей вызывается задолго до того, как вернулись методы их настройки.

Смежные вопросы