[英]Android Speech Recognition with RecyclerView
I'm using this project https://github.com/googlesamples/android-RecyclerView as reference to learn about RecyclerView, and implementing the answer by MLProgrammer-Cim here to handle onClick events. 我正在使用该项目https://github.com/googlesamples/android-RecyclerView作为参考来了解RecyclerView,并在这里实现MLProgrammer-Cim的答案来处理onClick事件。
In my CustomAdapter
activity I'm trying to start a method speakNow();
在我的CustomAdapter
活动中,我试图启动一个方法speakNow();
which is in another activity MainActivity
在另一个活动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();
.....
}
}
My MainActivity
我的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);
}
....
} }
This return a NullPointerException in MainActivity.speakNow(MainActivity.java:478)
which is this startActivityForResult(a, checka);
这会在MainActivity.speakNow(MainActivity.java:478)
返回一个NullPointerException,它是startActivityForResult(a, checka);
and Adapter$ViewHolder.onClick(CustomAdapter.java:287) which is ma.speakNow();
和Adapter $ ViewHolder.onClick(CustomAdapter.java:287),它是ma.speakNow();
I've read various "calling Methods from other activities returning NPE", questions and answers,not too sure how those apply to my case since MainActivity extends SampleActivityBase
which is a public abstract class which extends FragmentActivity. 我已经阅读了各种“其他活动返回NPE的调用方法”,问题和答案,但不太确定这些方法如何适用于我的案例,因为MainActivity扩展了SampleActivityBase
, SampleActivityBase
是扩展FragmentActivity的公共抽象类。
Where / how do I need to intialize the MainActivity ma = new MainActivity(); 我需要在哪里/如何初始化MainActivity ma = new MainActivity(); so its not null? 所以它不为空吗? Thanks 谢谢
the exception is thrown in startActivityForResult, that is because the Activity you create by MainActivity ma = new MainActivity();
在startActivityForResult中引发该异常,这是因为MainActivity ma = new MainActivity();
创建的Activity MainActivity ma = new MainActivity();
is different from the Activity create by system, the Activity you created has nothing in it, read the source code of Activity
to execute startActivityForResult
, it depends on some member variable.so you got the nullpoint exception. 与系统创建的Activity不同,您创建的Activity中没有任何内容,请读取Activity
的源代码以执行startActivityForResult
,这取决于某些成员变量。因此,您会得到nullpoint异常。 you can add a setter in you adapter, pass the reference of Activity to adapter 您可以在适配器中添加设置器,将Activity的引用传递给适配器
public void setActivity(Activity aty) {
this.aty = aty;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.