2015-07-11 6 views
0

Я использую этот проект https://github.com/googlesamples/android-RecyclerView в качестве ссылки, чтобы узнать о RecyclerView и реализовать ответ MLProgrammer-Cim here для обработки событий onClick.Android Распознавание речи с RecyclerView

В моей CustomAdapter деятельности я пытаюсь запустить метод speakNow();, который находится в другой деятельности MainActivity

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { 
private static final String TAG = "CustomAdapter"; 
... 

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    ... 
    public MyViewHolderClicks mListener; 
    private Context context; 
    MainActivity ma = new MainActivity(); 

//  FragmentTransaction ft =  ((FragmentActivity)context).getSupportFragmentManager().beginTransaction(); 
//  SampleActivityBase fragment = (SampleActivityBase)ft.findFragmentByTag("SampleActivityBase"); 


    public ViewHolder(View myv, MyViewHolderClicks listener) { 

     super(myv); 
     mListener = listener; 
     .... 
     imageIcon.setOnClickListener(this); 
     myv.setOnClickListener(this); 
     this.context =context; 


    } 
    @Override 
    public void onClick(View v) { 
     int position = getLayoutPosition(); 
     if (v instanceof Button){ 
      mListener.onTomato((Button) v, getLayoutPosition()); 
      switch (v.getId()) { 

       case R.id.button_for_cardview: 
        ma.speakNow(); 
..... 
} 
} 

Мои MainActivity

public class MainActivity extends SampleActivityBase { 
.... 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    .... 
    //Intent intent = new Intent(getApplicationContext(),  CustomAdapter.class); 
    //startActivityForResult(new Intent(this, CustomAdapter.class), checka); 
    if (savedInstanceState == null) { 
     FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
     RecyclerViewFragment fragment = new RecyclerViewFragment(); 
     transaction.replace(R.id.sample_content_fragment, fragment); 
     transaction.commit(); 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == checka && resultCode == RESULT_OK){ 
     ArrayList<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
     lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results)); 

     ..... 
     } 

    } 
    super.onActivityResult(requestCode, resultCode, data); 


} 

protected void speakNow() { 
    Intent a = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    a.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    a.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 6); 
    a.putExtra(RecognizerIntent.EXTRA_PROMPT, GlobalVariables.getInstance().getRightAnswer1()); 
    startActivityForResult(a, checka); 
} 
.... 

}

Это возвращает NullPointerException в MainActivity.speakNow(MainActivity.java:478) который является startActivityForResult(a, checka); и адаптер $ ViewHolder.onClick (CustomAdapter.java:287), который является ma.speakNow();

Я читал различные «методы вызова других мероприятий возвращения NPE», вопросы и ответы, не слишком уверен, как те относятся к моему делу поскольку MainActivity расширяет SampleActivityBase, который является публичным абстрактным классом, который расширяет FragmentActivity.

Где/как мне нужно интегрировать MainActivity ma = new MainActivity(); так что это не нуль? Благодаря

ответ

0

исключение выбрасывается в startActivityForResult, это потому, что активность создается путем MainActivity ma = new MainActivity(); отличается от активности создания системы, Активность вы создали не имеет ничего в нем, читать исходный код Activity для выполнения startActivityForResult, его зависит от некоторой переменной-члена. Вы получили исключение nullpoint. вы можете добавить сеттер в свой адаптер, передать ссылку Activity на адаптер

public void setActivity(Activity aty) { 
    this.aty = aty; 
} 
+0

Спасибо за ответ. Я уверен, что это очень полный ответ, но из-за моих ограничений я не понимаю, как передать ссылку на активность на адаптер и как установить его для запуска метода talkNow(). Не могли бы вы подробнее использовать код, который я опубликовал выше..thanks – Mcorv

+0

ok, понял, что означало u, означает снова! – Mcorv

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