有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android FLAG_ACTIVITY_NEW_TASK不工作

我在自定义onClick侦听器中调用startActivity()时遇到问题。代码可以很好地编译,但当它在执行过程中达到该点时,我会得到一个nullPointerException

代码

private static class ProverbAdapter extends ArrayAdapter<String> {
    MainActivity ma;
    public ProverbAdapter(Context context, int layout, int resId, String[] items) {
        super(context, layout, resId, items);
        this.ma = new MainActivity();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        Context context = getContext();
        if(row == null) {
            row = LayoutInflater.from(context).inflate(R.layout.proverb_layout, parent, false);
        }

        String item = getItem(position);
        TextView proverbDate = (TextView)row.findViewById(R.id.proverb_date);
        TextView proverbText = (TextView)row.findViewById(R.id.proverb_content);
        String[] data = item.split("----");
        proverbDate.setText(data[0]);
        proverbText.setText(data[1]);

        ImageButton emailButton = (ImageButton)row.findViewById(R.id.emailButton);
        ImageButton twitterButton = (ImageButton)row.findViewById(R.id.twitterButton);
        ImageButton facebookButton = (ImageButton)row.findViewById(R.id.facebookButton);

        emailButton.setOnClickListener(this.ma.new ProverbOnClickListener(data[0], data[1], "email", context));
        twitterButton.setOnClickListener(this.ma.new ProverbOnClickListener(data[0], data[1], "twitter", context));
        facebookButton.setOnClickListener(this.ma.new ProverbOnClickListener(data[0], data[1], "facebook", context));

        return row;
    }
}

public class ProverbOnClickListener implements OnClickListener {

     String proverb_date, proverb_content, eventType;
     Context context;

     public ProverbOnClickListener(String proverb_date, String proverb_content, String eventType, Context context) {
          this.proverb_date = proverb_date;
          this.proverb_content = proverb_content;
          this.eventType = eventType;
          this.context = context;
     }

     @Override
     public void onClick(View v) {
         Toast.makeText(this.context, this.eventType + ": " + this.proverb_content, Toast.LENGTH_SHORT).show();
         if(this.eventType == "email") {
             Intent i = new Intent(Intent.ACTION_SEND);
                     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             i.setType("message/rfc822");
             i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"recipient@example.com"});
             i.putExtra(Intent.EXTRA_SUBJECT, "subject of email");
             i.putExtra(Intent.EXTRA_TEXT   , "body of email");
             try {
                 context.startActivity(Intent.createChooser(i, "Send mail..."));
             } catch (安卓.content.ActivityNotFoundException ex) {
                 Toast.makeText(this.context, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
             }
         }
     }

  }

例外情况

FATAL EXCEPTION: main 安卓.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

我按照编译器的建议添加了新标志,但它仍然会因相同的错误而崩溃

***编辑****

在第一次响应中遵循建议后,我的适配器现在看起来像:

private static class ProverbAdapter extends ArrayAdapter<String> {
    Context context;
    public ProverbAdapter(Context context, int layout, int resId, String[] items) {
        super(context, layout, resId, items);
        this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        if(row == null) {
            LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = li.inflate(R.layout.proverb_layout, parent, false);
        }

        String item = getItem(position);
        TextView proverbDate = (TextView)row.findViewById(R.id.proverb_date);
        TextView proverbText = (TextView)row.findViewById(R.id.proverb_content);
        String[] data = item.split("----");
        proverbDate.setText(data[0]);
        proverbText.setText(data[1]);

        ImageButton emailButton = (ImageButton)row.findViewById(R.id.emailButton);
        ImageButton twitterButton = (ImageButton)row.findViewById(R.id.twitterButton);
        ImageButton facebookButton = (ImageButton)row.findViewById(R.id.facebookButton);

        emailButton.setOnClickListener(new ProverbOnClickListener(data[0], data[1], "email", context));
        twitterButton.setOnClickListener(new ProverbOnClickListener(data[0], data[1], "twitter", context));
        facebookButton.setOnClickListener(new ProverbOnClickListener(data[0], data[1], "facebook", context));

        return row;
    }
}

但是我收到了一个编译错误

No enclosing instance type of MainActivity is accessible.


共 (1) 个答案

  1. # 1 楼答案

    尝试一些修改

    this.ma = new MainActivity(); //it is wrong
    

    不要实例化活动

    试试这个

     Context context;
        public ProverbAdapter(Context context, int layout, int resId, String[] items) {
            super(context, layout, resId, items);
           this.context=context;
        }
    

    在需要上下文的地方使用这个变量上下文