繁体   English   中英

关于 --> .this 用法的好奇心

[英]Curiosity about Usage of --> .this

我对 Android 和 Java 很陌生。 我对代码中this的用法有一些疑问。

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  Intent thePigeonsss = new Intent(this, SecondActivity.class);
}

void attachButtonListener(Button btn, final String theString) {
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
          Intent thePigeon = new Intent(this, SecondActivity.class);
          thePigeon.putExtra(theString, theString);
        }
    });
}

上面是我的代码片段。 我不明白的是attachButtonListener的 Intent 构造attachButtonListener 意图构造函数中存在一些错误,原因是解析意图构造函数出错。 但是在我用MainActivity.this替换 attachButtonListener 中的 this 之后,错误就消失了。 我试图阅读 Android 文档,它说它应该是 Intent 构造函数中的上下文。

谁能向我解释为什么我必须使用MainActivity.this而不是this 我也对我现在所说的感到困惑。 是不是因为 Context 不存在于这个函数中而它存在于onCreate函数中是因为 Context 是用super.onCreate创建的?

在源代码中:

public Intent(Context packageContext, Class<?> cls) {
  mComponent = new ComponentName(packageContext, cls);
}

this意味着您的代码中的View.OnClickListener()

我们需要MainActivity.this作为Context

改成这样:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      Intent thePigeon = new Intent(YourActivity.this, SecondActivity.class);
      thePigeon.putExtra(theString, theString);
    }
});

Intent 构造函数需要两个参数Intent(context, class)和 this 关键字指的是当前对象。 所以,

void attachButtonListener(Button btn, final String theString) {
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent thePigeon = new Intent(this, SecondActivity.class);
            thePigeon.putExtra(theString, theString);
        }
    });
}

在上面的意图中, this是指点击侦听器的匿名类,它不是从 Activity/Fragment 扩展的,因为它没有上下文。 所以,如果你做MainActivity.this这将引用具有上下文的 MainActivity 类。

为什么我必须使用 MainActivity.this 而不是 this?

答案是范围。

this ”指的是方法正在执行的对象。 intent的“上下文”由Activity提供。 但是创建新意图的位置是在View.OnClickListener类的匿名对象内,该对象包含在 Activity 的实例中。

从匿名对象内部,您可以使用类名称前面的“this”来引用封装对象的实例。
在这种情况下MainActivity.this

通过这种方式,您可以掌握创建意图所需的“上下文”。

有两种类型的上下文:

应用程序上下文与应用程序相关联,并且在应用程序的整个生命周期中始终相同——它不会改变。 因此,如果您使用 Toast,您可以使用应用程序上下文甚至活动上下文(两者),因为 Toast 可以在您的应用程序中的任何位置显示,并且不附加到特定窗口。 但是有很多例外,一种例外是当您需要使用或传递活动上下文时。

活动上下文活动相关联,如果活动被破坏,则可以被破坏——单个应用程序可能有多个活动(很可能)。 有时您绝对需要活动上下文句柄。 例如,如果您启动一个新活动,您需要在其 Intent 中使用活动上下文,以便新启动的活动在活动堆栈方面连接到当前活动。 但是,您也可以使用应用程序的上下文来启动新活动,但是您需要设置标志Intent.FLAG_ACTIVITY_NEW_TASK以将其视为新任务。

让我们考虑一些情况:

MainActivity.this指的是扩展Activity类的MainActivity上下文,但基类(activity)也扩展了Context类,因此可以用来提供Activity上下文。

getBaseContext()提供活动上下文。

getApplication()提供应用程序上下文。

getApplicationContext()还提供应用程序上下文。

如果您使用,这指的是当前上下文
Intent thePigeonsss = new Intent(this, SecondActivity.class);

意向构造函数需要您的MainActivity的情况下使上述线路工作正常,如果你想在你的onClickListner使用此那么上面的线,然后this将指向View.OnClickListener()所以你必须指定其意图的构造并不需要MainActivity.this 指向引用您的 MainActivity 的上下文。 所以在你的 onClickListner 你必须把这一行

Intent thePigeonsss = new Intent(MainActivity.this, SecondActivity.class);

您必须指定采用 MainActivity 上下文的 Intent 构造函数

文档

在实例方法或构造函数中, this 是对当前对象的引用——正在调用其方法或构造函数的对象。 您可以使用 this 从实例方法或构造函数中引用当前对象的任何成员。

当您使用以下代码时:

void attachButtonListener(Button btn, final String theString) {
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent thePigeon = new Intent(this, SecondActivity.class);
            thePigeon.putExtra(theString, theString);
        }
    });
}

this将引用View.OnClickListener() ,它是this所在的对象。

因此,您需要使用 MainActivity.this 来引用 MainActivity 的对象。 您需要通过以下方式更改您的意图创建:

Intent thePigeon = new Intent(MainActivity.this, SecondActivity.class);

this 可用于引用当前类实例变量。

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  Intent thePigeonsss = new Intent(this, SecondActivity.class);
}

在上面的代码中, this指的是主活动对象,因此当您在参数中传递 this 时,它属于主活动。

void attachButtonListener(Button btn, final String theString) {
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
          Intent thePigeon = new Intent(this, SecondActivity.class);
          thePigeon.putExtra(theString, theString);
        }
    });
}

但是当您在按钮单击侦听器中使用 this 时,这表示当前接口没有任何可用上下文,并且编译器正在生成错误,但是当您传递MainActivity.this ,它将从活动类中获取上下文,因此错误是走了。

您还可以使用view.getContext()而不是MainActivity.this如果你不想使用MainActivity.this但最好是使用MainActivity.this启动任何新的活动。

btn.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
     Intent thePigeon = new Intent(view.getContext(), SecondActivity.class);
      thePigeon.putExtra(theString, theString);

  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM