Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对-->;用法的好奇。这_Java_Android - Fatal编程技术网

Java 对-->;用法的好奇。这

Java 对-->;用法的好奇。这,java,android,Java,Android,我对Android和Java还很陌生。我对这个在代码中的用法有些怀疑 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent thePigeonsss = new Intent(this, SecondActivity.class); } void attachBut

我对Android和Java还很陌生。我对这个在代码中的用法有些怀疑

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

有人能解释一下为什么我必须使用
MainActivity.this而不是
this
?我对我现在所说的也感到困惑。是因为上下文不存在于此函数中,而存在于
onCreate
函数中是因为上下文是使用
super.onCreate创建的吗?

并且在源代码中:

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

意图构造函数需要两个参数
Intent(上下文,类)
这个关键字指的是当前对象。 所以


在上面的intent
中,此
指的是click listener的匿名类,该类未从活动/片段中扩展,原因是它没有上下文。因此,如果您执行
MainActivity。这将引用具有上下文的MainActivity类。

有两种类型的上下文:

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

活动上下文与活动关联,如果活动被销毁,则可以将其销毁——单个应用程序可能有多个活动(可能性更大)。有时您绝对需要活动上下文句柄。例如,如果启动一个新活动,则需要在其意图中使用活动上下文,以便新启动活动在活动堆栈方面连接到当前活动。但是,您也可以使用应用程序的上下文来启动新活动,但随后需要在Intent中设置flag
Intent。flag_activity\u new_TASK
,将其视为新任务

我们考虑一些情况:

MainActivity。此
引用扩展活动类的MainActivity上下文,但基类(Activity)也扩展了上下文类,因此它可以用于提供活动上下文

getBaseContext()
提供活动上下文

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

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

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

答案是范围

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

从匿名对象内部,您可以在类名称前加上“this”来引用Encoding对象的instace。
在本例中,
main活动。此


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

如果您使用
Intent thepigonss=新的Intent(这是第二个activity.class)

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

Intent thepigonss=新的Intent(main activity.this,SecondActivity.class)

您必须指定从以下位置获取MainActivity上下文的目标构造函数:

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

使用以下代码时:

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);
        }
    });
}
将引用
视图。OnClickListener()
,它是
所在的对象

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

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

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

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);
        }
    });
}
btn.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
     Intent thePigeon = new Intent(view.getContext(), SecondActivity.class);
      thePigeon.putExtra(theString, theString);

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

您也可以使用
view.getContext()
而不是
MainActivity。如果您不想使用MainActivity,则可以使用此
。但最好使用MainActivity.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);
        }
    });
}
btn.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
     Intent thePigeon = new Intent(view.getContext(), SecondActivity.class);
      thePigeon.putExtra(theString, theString);

  }
});

这不是OP感兴趣的,OP感兴趣的是知道“有人能向我解释为什么我必须使用MainActivity.this而不是this吗?”
这是指中的
视图的匿名实现。OnClickListener