2013-03-07 2 views
0

У меня возникла проблема с вызовом функции startActivity() в Intent из моего пользовательского onClick Listener. Код компилируется отлично, но когда он доходит до этой точки выполнения, я получаю исключение nullPointerException.Android FLAG_ACTIVITY_NEW_TASK не работает

Код

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[]{"[email protected]"}); 
      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 (android.content.ActivityNotFoundException ex) { 
       Toast.makeText(this.context, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    } 

Исключение

FATAL ИСКЛЮЧЕНИЕ: главный android.util.AndroidRuntimeException: Вызов startActivity() из-за пределов контекста деятельности требует флаг FLAG_ACTIVITY_NEW_TASK. Это действительно то, что вы хотите?

Я добавил новый флаг в качестве компилятора, но он по-прежнему падает с той же ошибкой.

* * EDIT * ***

После следующих советов в первом ответе, мой адаптер теперь выглядит следующим образом:

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; 
    } 
} 

Однако я получаю ошибку компиляции ,

Отсутствует доступный тип экземпляра MainActivity.

+0

Попробуйте 'Я .setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); 'вместо' i.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); ' –

+0

@RaghavSood Спасибо за предложение. Я попробовал, и я все равно получаю ту же ошибку. –

+0

Вы уверены, что это конкретное намерение вызывает проблему? –

ответ

2

Попробуйте несколько модификаций

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; 
    } 

использовать эту переменную контекст, в котором когда-либо вам нужно контекст

+0

@JackSlingerland обновите свой вопрос ... – Pragnani

+0

Я обновил свой вопрос с помощью нескольких изменений и новой ошибки компиляции. –

+0

LayoutInflater li = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE) получает разметку макета, подобную этому, instaed статического метода фабрики – Pragnani

Смежные вопросы