2016-03-21 89 views
0

我看到这样的相关职位 - Disable the Asynchronous display of a Toast [duplicate]和我尝试从那里取消()方法,但他们不能解决我的问题。也许这是因为与偏好活动有关的一些差异。需要显示吐司后点击

请帮助我改进我的代码,使Toast在点击后显示。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.pref_screen); 
    Context context = getApplicationContext(); 
    settings = PreferenceManager.getDefaultSharedPreferences(context); 
    settings.registerOnSharedPreferenceChangeListener(this); 
} 

public void onSharedPreferenceChanged(SharedPreferences settings, String key) { 
    Toast theToast; 
    theToast = Toast.makeText(this, "toast text", Toast.LENGTH_LONG); 

    if(key.equals("checkbox_key")){ 
     theToast.show(); 
    } 
    if (key.equals("checkbox_key")&& theToast != null){ 
     theToast.cancel(); 
    } 
} 

回答

0

你的问题措辞不佳,但我相信你所要求的是如何取消当前显示的吐司当您检查/取消选中一个新的框,并要显示一个新的吐司(阅读你的代码后)在那种情况下马上。

问题是,您要取消刚刚制作的Toast,而不是之前创建的Toast。

尝试将Toast存储在成员变量中并取而代之。喜欢的东西:

private Toast mCurrerntToast = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    //... 
} 

public void onSharedPreferenceChanged(SharedPreferences settings, String key) { 
    if(key.equals("checkbox_key")){ 
     //If there is a previous toast displayed, cancel it 
     if(mCurrentToast != null){ 
      mCurrentToast.cancel(); 
     } 

     //Display a new, more current Toast message 
     mCurrentToast = Toast.makeText(this, "toast text", Toast.LENGTH_LONG); 
     mCurrentToast.show(); 
    } 
} 

让我知道如果我对你在问什么假设是错的,我会尽力帮助更多的,但我敢肯定这是你正在试图解决的问题。

+0

你明白我的正确。 至于你的解决方案。 AndroidStudio显示注释,变量“mCurrentToast”可能尚未初始化。我在这之前移动了这行 'mCurrentToast = Toast.makeText(this,“toast text”,Toast.LENGTH_LONG);' 之前的所有if语句像我以前的代码,但它会崩溃应用程序(NullExeption)。 – Robert

+0

您不能在“.cancel()”行之前移动该行,否则您将取消新的Toast而不是旧的Toast。创建它时,请将mCurrentToast设置为null。我会更新我的代码示例以反映这一点。 – ajpolt

+0

现在它完美地工作。感谢您的帮助! – Robert