如何修复方法startActivity(Intent)未定义类型new View.OnClickListener()语法错误

时间:2013-07-06 18:42:06

标签: android eclipse android-emulator

我的代码出现语法错误,在“getView”中我想让按钮“update”的监听器移动到另一个活动:

enter image description here

@Override
    public View getView(int position, View convertView, ViewGroup parent) {


        LayoutInflater l = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        View rowView = l.inflate(R.layout.temp, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.textView1);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView1);
        Button update = (Button) rowView.findViewById(R.id.button1);

//      update.setOnClickListener(new View.OnClickListener() {
//          
//          @Override
//          public void onClick(View v) {
//
//                 Intent redirect = new Intent(getApplicationContext(),Update.class);
//                 startActivity(redirect);
//              
//          }
//      });




        textView.setText(sa.get(position));


        return rowView;
    }

我试图解决这些关于“意图”的错误,但我失败了:(

  1. 方法startActivity(Intent)未定义类型new View.OnClickListener()

  2. 方法getApplicationContext()未定义类型new View.OnClickListener()

  3. 甚至当我从“onClick”方法移动这些语句时问题没有改变!! 我导入了“Intent”库,如何解决?

5 个答案:

答案 0 :(得分:14)

如果您的适配器位于不同的文件中,则需要活动上下文。

您需要将活动上下文从活动类传递给适配器构造函数。

http://developer.android.com/reference/android/content/Context.html#startActivity(android.content.Intent)

startActivity是您的活动类的一种方法。因此,您需要活动上下文来启动活动。

而不是getApplicationContext使用活动上下文。

When to call activity context OR application context?

通过commonsware检查答案。

     update.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {

            Intent redirect = new Intent(context,Update.class);
            context.startActivity(redirect);    
      }
      });

答案 1 :(得分:2)

尝试

final Activity thisActivity = this;

update.setOnClickListener(new View.OnClickListener() {

          @Override
          public void onClick(View v) {

                 Intent redirect = new Intent(thisActivity,Update.class);
                 thisActivity.startActivity(redirect);

          }
      });

答案 2 :(得分:2)

对于我这样的问题,这对我有帮助:

  @Override
  public void onClick(View v) {
                    Intent intent = new Intent(G.context, SecondActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    G.context.startActivity(intent);
  }
  });

在G Class中添加上下文:

public class G extends Activity {

    public static Context context;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        context = getApplicationContext();

    }
}

答案 3 :(得分:1)

您只需拨打context.startActivity,即可按照以下步骤进行操作

三个简单的步骤

1)声明局部变量Context mCtx

2)通过将参数传递给构造函数/方法,或者在onCreate方法中,如果在活动中使用上面的代码,则使用Activity上下文初始化它。

3)致电mCtx.startActivity(intent);

您可以致电ActivityName.this.startActivity()

编辑: - 作为标准dmon评论,您只需使用本地上下文实例

答案 4 :(得分:0)

问题的根源在于您无法从应用程序上下文启动活动(仅来自您有权这样做的活动上下文)。原因是android将应用程序的所有活动捆绑为一个组(任务),以便允许不同应用程序之间的多任务处理。当你启动一个新的应用程序,或者按下主页按钮时,你的应用程序(连同它的活动backstack)将转到后台并将场景留给一个新任务(使用不同的活动backstack等等等等) )。有关此机制的更多信息,请查看此处(http://developer.android.com/guide/components/tasks-and-back-stack.html)。

为了获得可以从中获取新活动的上下文,您可以通过调用viewgroup.getContext()来获取您正在膨胀的视图的父级的上下文 - 尽管您必须声明viewgroup as final,这是好的,因为你不应该触及父母。

你的getView的草稿:

@Override
public View getView(int position, View convertView, final ViewGroup parent) {


    LayoutInflater l = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
    View rowView = l.inflate(R.layout.temp, parent, false);
    TextView textView = (TextView) rowView.findViewById(R.id.textView1);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView1);
    Button update = (Button) rowView.findViewById(R.id.button1);

  update.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {
             Intent redirect = new Intent(parent.getContext(),Update.class);
             startActivity(redirect);
      }
  });




    textView.setText(sa.get(position));


    return rowView;
}