【问题标题】:How to use Intent constructor [duplicate]如何使用 Intent 构造函数 [重复]
【发布时间】:2017-04-20 12:14:06
【问题描述】:

这是我的 MainActivity.java

public class MainActivity extends AppCompatActivity {

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

  Button bt=(Button) findViewById(R.id.bt);
        bt.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) {
                Intent i=new Intent(MainActivity.this,SecondAcitvity.class);
                EditText et=(EditText) findViewById(R.id.et);
                String text=et.getText().toString();
                i.putExtra("name",text);
                startActivity(i);
            }
        });
    }
}

这是我的 SecondActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class SecondAcitvity extends AppCompatActivity {
    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        TextView tv = (TextView) findViewById(R.id.tv);
        Intent i=getIntent();
        Bundle b=i.getExtras();
        if(b!=null)
        {
String name=(String)b.get("name");
            tv.setText(name);

        }

    }
}

我在使用什么

Intent i=new Intent(MainActivity.this,SecondAcitvity.class);

然后代码运行良好

但是当我使用时

Intent i=new Intent(this,SecondAcitvity.class);

然后它给出错误。

无法解析构造函数

Intent(匿名 android.view.View.onClickListener,java.lang.Class{com.example.intents.SecondActivity})`

为什么会这样?

【问题讨论】:

  • 您实际上遇到了什么错误
  • OnClickListener内部,this指的是OnClickListener,它不是Context,这是Intent构造函数所期望的。
  • 因为你是在View.OnClickListener接口,所以如果你使用this,说明你调用的是这个接口,而不是MainActivity

标签: android android-intent


【解决方案1】:

this 关键字引用你当前所在的类。

Button bt=(Button) findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener()
{
      @Override
      public void onClick(View v) {
          Intent i=new Intent(this, SecondAcitvity.class);
          EditText et = (EditText) findViewById(R.id.et);
          String text = et.getText().toString();
          i.putExtra("name",text);
          startActivity(i);
     }
});

您实际上会引用View.OnClickListener();,所以您在编写上述代码时基本上是在说:

Intent i = new Intent(new View.OnClickListener(), SecondActivity.class);

这种结构称为内部类。当您在内部类中时(如 onClickListener 实现),您需要在使用 this 关键字时专门针对外部类。

所以说MainActivity.this,您明确要求以外部类(即MainActivity)为目标。

【讨论】:

    【解决方案2】:

    因为您在匿名类中调用意图构造函数,而 this 指的是当前实例。当您传递“MainActivity.this”时,这意味着您明确说明要考虑什么实例。我希望回答这个问题。

    bt.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) {
                Intent i=new Intent(MainActivity.this,SecondAcitvity.class);
                EditText et=(EditText) findViewById(R.id.et);
                String text=et.getText().toString();
                i.putExtra("name",text);
                startActivity(i);
            }
        });
    }
    

    【讨论】:

      【解决方案3】:

      bt.setOnClickListener 它实际上是在创建一个实现 OnClickListener 的匿名内部类。如果你在意图中传递它对匿名内部类的引用,这就是你得到错误的原因。你需要在意图中传递活动引用。

      Intent i=new Intent(this,SecondAcitvity.class);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-17
        • 1970-01-01
        • 2017-01-05
        相关资源
        最近更新 更多