【问题标题】:Quick 'this' Keyword Query - Help Appreicated快速“this”关键字查询 - 帮助赞赏
【发布时间】:2011-11-27 16:04:16
【问题描述】:

所以基本上无法理解 java 中“this”关键字的用法。已经阅读了大约五个教程,虽然不是很好。有人可以快速解释一下它是如何与以下代码相关的吗?这是一个 android,它将一个 xml 按钮 (btn_confirm) 分配给具有 Button 类型的 b。

   Button b = (Button)this.findViewById(R.id.btn_confirm);

b.setonclickListener(this);

完整代码:

public class dic_tut2 extends Activity implements onclickListener {

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button b = (Button)this.findViewById(R.id.btn_confirm);
    b.setonclickListener(this);
}

public void onclick(View v) {

    TextView tv = (TextView)this.findViewById(R.id.tv_welcome);
    EditText et = (EditText)this.findViewById(R.id.txt_name);

    String text = "Hello, " + et.getText().toString() + ".\n\n";
    text += "Welcome to android development. :)";

    tv.setText(text);

}

}

【问题讨论】:

标签: java android keyword


【解决方案1】:

在您看到的示例中,该类很可能是一个活动类。像这样的:

class MainActivity extends Activity implements OnClickListener {

    @Override
    protected onCreate(Bundle bundle) {
        Button b = (Button)this.findViewById(R.id.btn_confirm);

        b.setOnClickListener(this);

    } 

    @Override
    public onClick(View v) {
        // Do something!
    }
}

这是可能的,因为对象“this”既是一个在其视图中可以有一个按钮的活动,它也实现了 OnClickListener,它允许在单击该按钮时调用其 onClick 方法。这是通过向按钮的 setOnClickListener 函数提供对自身的引用来完成的。

【讨论】:

  • 感谢您的解释。我看不出为什么在 b.setOnClickListener 中没有使用 onClick 方法,或者“this”如何引用 onClick。我的想法在这里是正确的,还是我对代码的工作方式不满意?
  • 两种方式都可以。通过在函数之外使用它,它可以更轻松地在 onClick 函数中操作 Activity。这种方法的缺点是,如果要在activity中使用多个按钮,每次都需要检查哪个按钮调用了onClick函数。
  • 如果我们在 b.setOnClickListener 中使用 'this' 关键字而不是 'onClick',你的意思是最后一句吗,如果我们有多个,我们需要检查哪个函数调用它按钮?例如。如果我们有 b.setOnClickListener(this) 和 c.setOnClickListener(this)?还是我猜错了你的意思?仍然不确定两件事,1)“this”如何在您的代码中指代 onClick 方法,以及 2)您在上一个回复中的第二句话是什么意思。对这些问题表示歉意,我非常感谢您的帮助。
  • 是的,我就是这个意思。对于你的第一个问题:它指的是onClick()方法,因为当onCreate()中使用“this”时,它指的是当前对象,它只能是MainActivity的对象,因为onCreate()在MainActivity中。
【解决方案2】:

this 指的是您正在使用它的类的当前实例。例如:

class A {
    public void f() {
       A obj = this; // current instance of A
    }
}

所以如果以后我创建一个 A 的实例:

public static void main(String[] args) {

    A a = new A();
    a.f(); // the 'this' inside f() is actually 'a'.
}

所以你的代码:

b.setonclickListener(this);

将按钮 b 的 onclickListener 设置为您所在类的当前实例(调用方法的实例)。

编辑:好的,这是一个完整的例子:

class A {
   public char c;
   public A(char c) { this.c = c; }
   public void f() {
       System.out.println(this.c);
   }
}

public static void main(String[] args) {
   A a = new A('a');
   a.f(); // prints 'a' because 'this' inside f() is actually object 'a'.

   A b = new A('b');
   b.f(); // prints 'b' because 'this' inside f() is actually object 'b'.      
}

【讨论】:

  • 嘿! Android 应用程序中没有 main ! ;)
  • 好的,这无关紧要,仅用于示例。它可以是任何方法。这也被标记为 Java btw。
  • 感谢您的回复。我的主要问题是我只是不明白为什么需要它。您已经使用了 this 关键字,但我真的完全看不到它的作用。我真的很抱歉,这没有任何意义。
  • @user1068042:好好想想。您的侦听器必须是当前类的实例,对吗?如果您不使用“this”,则必须自己创建一个新实例并将其设置为侦听器。但是使用 'this' 你可以设置当前对象。
  • 当前对象是什么?声明 (b.setonClickListener(this);),我不确定它是做什么的,它也指的是什么“this”。我已经更新了我的原始帖子,以及我理解的“this.findViewByID”,因为没有“this”,我们每次使用它时都需要创建一个 a.findViewByID、b.fiendViewByID 等。我的想法在这里正确吗?再次感谢。
【解决方案3】:
b.setonclickListener(this);

这意味着b 的点击监听器是this:当前对象。在这种情况下,它是您的Activity

Activity 实现了OnClickListener,它提供了onclick 方法。

你基本上是在说“按钮,当你被点击时,这里是如何处理它的——你用我自己的实现来处理它。”

它不会this,它可以是任何实现OnClickListener的东西。通过将实现保持在Activity 的本地,您可以轻松访问其(Activity)成员变量(在这种情况下您不需要)。

onclick 处理程序中,this 引用是多余的——您可以在没有this 的情况下访问findViewById 方法。无需限定符即可访问成员方法和变量。

【讨论】:

    猜你喜欢
    • 2021-09-26
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    相关资源
    最近更新 更多