关于使用的好奇心 - > 。这

时间:2017-10-16 04:31:03

标签: java android

我是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构造函数。意图构造函数中存在一些错误,原因是解析意图构造函数出错。但是在用MainActivity.this替换attachButtonListener中的this后,错误就消失了。我试图阅读Android文档,它说它应该是Intent构造函数中的上下文。

有人可以向我解释为什么我必须使用MainActivity.this代替this吗?我对现在谈论的内容感到困惑。是因为Context不存在于此函数中并且它存在于onCreate函数中,因为Context是使用super.onCreate创建的?

7 个答案:

答案 0 :(得分:4)

来源:

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);
    }
});

答案 1 :(得分:1)

Intent构造函数需要两个参数sh run.sh 此关键字指的是当前对象。 所以,

Intent(context, 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); } }); } 中引用了一个匿名的点击侦听器类,它没有从Activity / Fragment扩展,因为它没有上下文。因此,如果你执行this,这将引用具有上下文的MainActivity类。

答案 2 :(得分:1)

  

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

答案是范围。

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

从匿名对象内部,您可以引用封锁对象的实例,其中“this”前面是Class的名称。
在这种情况下MainActivity.this

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

答案 3 :(得分:0)

有两种类型的上下文:

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

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

让我们考虑一些案例:

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

getBaseContext()提供活动背景。

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

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

答案 4 :(得分:0)

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

Intent构造函数需要MainActivity的上下文,所以上面的行工作正常,如果你想在onClickListner中使用它,那么上面的行this将指向Intent构造函数没有的View.OnClickListener()需要这样你必须指定MainActivity.this来指向你的MainActivity的上下文。所以在你的onClickListner中你必须把这行

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

您必须指定采用MainActivity

上下文的Intent构造函数

答案 5 :(得分:0)

来自documentation

  

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

使用以下代码时:

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);

答案 6 :(得分:0)

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

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

  Intent thePigeonsss = new Intent(this, SecondActivity.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时,这表示当前接口没有任何可用的上下文,并且编译器正在生成错误,但是当您传递MainActivity.this时,它将从活动中获取上下文因此错误消失了。

如果您不想使用MainActivity.this,也可以使用view.getContext()代替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);

  }
});