2

我在 Android(以及一般的 Java)上处于初级编程水平。我确实了解 Activity 继承自 Context 类。但是,在我遇到的每个代码片段中,每次必须提及上下文时,它都设置为“this”。

我的问题是:上下文何时与“this”不同?您能否提供一个需要与“this”不同的上下文示例?

非常感谢。

4

5 回答 5

3

this通常,当您在 Activity 的“内部”时,您会想要使用。但是,例如,当您使用 Helper 类时,该引用this将不起作用。一个例子可以是这样的:

public class MyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
    }
}

一个案例,您不能:

public class MyHelper
{
    /* some code of yours */

    public void lockOrientation(Activity activity)
    {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
    }
}

上面的代码将方向锁定为当前方向。请注意,您需要为该方法提供一个 Activity 参数,因为您不能使用:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

在第一个示例中,您可以使用它this来实现这一点,因为您处于 Activity 的“内部”。

另一种类型的例子,你如何设置onClickListener.

第一个例子,当你使用this

public class MyActivity extends Activity implements View.OnClickListener
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Button btn=(Button)findViewById(R.id.mybutton);
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v)
    {
        //handle the click event
    }
}

在此示例中,您可以使用this因为在第一行中,我们写了implements View.OnClickListener,因此该类继承自给定接口。没有工具,你做不到。onClickListener设置without的示例this

public class MyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Button btn=(Button)findViewById(R.id.mybutton);
        btn.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //handle the click event
            }
        });
    }
}

在第二个示例中,我们定义了一个Anonymous Inner Class,它将处理按钮的单击事件。请注意,在这种情况下,我们的 Activity 不会implements View.OnClickListener

于 2013-10-14T11:02:07.100 回答
1
  1. 在外部类中,您直接使用“this”引用
  2. 在内部类或抽象类实现或接口实现中使用“classname.this”引用
于 2013-10-14T10:54:02.940 回答
1

例子:

class Example{
    int number = 0;

    public Example(int number){
        this.number = number;
    }
}

请注意,构造函数中的数字和类中的数字不相同。尽管它们具有相同的名称。说数字=数字没有意义。使用它,您可以在课堂上评估数字。

于 2013-10-14T10:52:18.870 回答
0

this是对当前对象的引用——正在调用其方法或构造函数的对象。

里面Activity的方法this可以作为Context对象使用,因为Activity继承自ContextThemeWrapper,继承自ContextWrapper,继承自Context

Fragment另一方面,A不继承自Context。因此,例如,要获得Context内部 a Fragment,您必须打电话getActivity()

这适用于您从中调用this的任何对象。

考虑你在OnClick()a 的方法中View.OnClickListener并且你想开始一个Activity

button.setOnClickListener (new View.OnClickListener() {
    public void onClick(View v) {

        Intent intent = new Intent(this, NextActivity.class); // wrong because 'this' is the OnClickListener object

        Intent intent = new Intent(CurrentActivity.this, NextActivity.class); // correct because 'this' is the CurrentActivity object

        startActivity(intent);
    }
});
于 2013-10-14T11:08:28.063 回答
0

例如,当您实现 OnClickListener 时,“this”是不同的。

于 2013-10-14T10:51:11.037 回答