Android 需要在单击后立即显示Toast

Android 需要在单击后立即显示Toast,android,preferenceactivity,android-toast,Android,Preferenceactivity,Android Toast,我看到了类似这样的相关帖子——我尝试了cancel()方法,但它们并没有解决我的问题。可能是因为某些差异与偏好活动有关 请帮助我改进代码,以便在单击后立即显示Toast @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_screen); Context co

我看到了类似这样的相关帖子——我尝试了cancel()方法,但它们并没有解决我的问题。可能是因为某些差异与偏好活动有关

请帮助我改进代码,以便在单击后立即显示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();
    }
}

您的问题措词不当,但我假设(在阅读代码之后)您要问的是,当您选中/取消选中一个新框并希望立即显示一个新的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();
    }
}

如果我对你所问问题的假设是错误的,请告诉我,我会尽力提供更多帮助,但我很确定这就是你试图解决的问题。

你理解我的意思是正确的。关于你的解决方案。AndroidStudio显示的注释表明,变量“mCurrentToast”可能尚未初始化。我移动了这一行
mCurrentToast=Toast.makeText(这是“Toast text”,Toast.LENGTH\u LONG)在所有if语句之前,就像我之前的代码一样,但它会使应用程序崩溃(NullExeption)。您不能将该行移到“.cancel()”行之前,否则您将取消新的Toast而不是旧的Toast。创建mCurrentToast时,只需将其设置为null。我将更新我的代码示例以反映这一点。