为什么我的吐司要在这么多不同的环境下工作?

时间:2018-08-01 17:25:21

标签: android

我正在Activity4.java中工作,代码为:

public class Activity4 extends Activity {
Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_4);
    spinner=findViewById(R.id.spinner);

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            if(Activity4.this==adapterView.getContext())
            Toast.makeText(adapterView.getContext(),adapterView.getSelectedItem().toString(),Toast.LENGTH_LONG).show();
        }

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

        }
    });
}
}

我在上面的代码中使用adapterView.getContext()作为上下文。但是,即使我将其替换为

之类的getApplicationContext(),

Toast.makeText(getApplicationContext(),adapterView.getSelectedItem()。toString(),Toast.LENGTH_LONG).show();

或者如果我这样写getBaseContext(),

Toast.makeText(getBaseContext(),adapterView.getSelectedItem().toString(),Toast.LENGTH_LONG).show();

烤面包看起来很好用。为什么会这样?

1 个答案:

答案 0 :(得分:0)

这是Toast.java中makeText()方法的实现:

/**
 * Make a standard toast that just contains a text view.
 *
 * @param context  The context to use.  Usually your {@link android.app.Application}
 *                 or {@link android.app.Activity} object.
 * @param text     The text to show.  Can be formatted text.
 * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or
 *                 {@link #LENGTH_LONG}
 *
 */
public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
    return makeText(context, null, text, duration);
}

如您在@param context的注释中所看到的,它说明通常通常是应用程序的上下文或活动的上下文。

但是文档:

  

此方法采用三个参数:应用程序上下文,文本   消息,以及烤面包的持续时间

声明上下文必须是应用程序上下文。

好吧,吐司似乎只需要一个上下文。
如果可能,我们必须使用应用程序上下文以避免意外结果。
虽然我还没见过。