我试图在我的APP上声明一个按钮(它在一个片段上),我尝试过的是:
TextView tvPregunta = (TextView) getActivity().findViewById(R.id.tvPregunta);
它没有给我一个错误,但是当我启动APP时它确实...
我的LogCat错误是:
01-30 08:22:18.865 16165-16165/joancolmenero.taulaperiodica.com.taulaperiodicaapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: joancolmenero.taulaperiodica.com.taulaperiodicaapp, PID: 16165
java.lang.NullPointerException
at joancolmenero.taulaperiodica.com.taulaperiodicaapp.JocFragment.seguentelement(JocFragment.java:102)
at joancolmenero.taulaperiodica.com.taulaperiodicaapp.JocFragment.onCreateView(JocFragment.java:90)
at android.app.Fragment.performCreateView(Fragment.java:1700)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.java:684)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
这一行是TextView tvPregunta。 :
at joancolmenero.taulaperiodica.com.taulaperiodicaapp.JocFragment.seguentelement(JocFragment.java:102)
这个是seguentelement();
:
at joancolmenero.taulaperiodica.com.taulaperiodicaapp.JocFragment.onCreateView(JocFragment.java:90)
seguentelement()
它是private void
创建的onCreateView
,所以我的问题是为什么这个TextView会崩溃?
我有onCreateView
我已经获得了根视图和空洞的调用...
onCreateView
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.joc_fragment, container, false);
// Titol del joc
TextView tvJuego = (TextView) rootView.findViewById(R.id.tvJuego);
// shadow del textview
tvJuego.setShadowLayer(1, 0, 3, Color.GRAY);
// creem una variable per a cada ib
// NewGame HIDEEEEEEEEEE
NewGame = (Button)rootView.findViewById(R.id.btNewGame);
NewGame.setVisibility(View.INVISIBLE);
NewGame.setText("");
// IB --> ID imageButton
berijuego=(ImageButton)rootView.findViewById(R.id.ibBeriJuego);
borojuego=(ImageButton)rootView.findViewById(R.id.ibBoroJuego);
cobajuego=(ImageButton)rootView.findViewById(R.id.ibCobaJuego);
indijuego=(ImageButton)rootView.findViewById(R.id.ibIndiJuego);
hidrojuego=(ImageButton)rootView.findViewById(R.id.ibHidroJuego);
ununjuego=(ImageButton)rootView.findViewById(R.id.ibUnunJuego);
plutojuego=(ImageButton)rootView.findViewById(R.id.ibPlutoJuego);
radijuego=(ImageButton)rootView.findViewById(R.id.ibRadiJuego);
promjuego=(ImageButton)rootView.findViewById(R.id.ibPromJuego);
sodijuego=(ImageButton)rootView.findViewById(R.id.ibSodiJuego);
zicrojuego=(ImageButton)rootView.findViewById(R.id.ibZicroJuego);
molijuego=(ImageButton)rootView.findViewById(R.id.ibMoliJuego);
// setOnClickListener para todoos
berijuego.setOnClickListener(this);
borojuego.setOnClickListener(this);
cobajuego.setOnClickListener(this);
indijuego.setOnClickListener(this);
hidrojuego.setOnClickListener(this);
ununjuego.setOnClickListener(this);
plutojuego.setOnClickListener(this);
radijuego.setOnClickListener(this);
promjuego.setOnClickListener(this);
sodijuego.setOnClickListener(this);
zicrojuego.setOnClickListener(this);
molijuego.setOnClickListener(this);
//Nivellactual 12 MAX o aun quedan errores
if ((nivellactual <= 12) || (errores > 0)) {
nivellactual = nivellactual + 1;
seguentelement();
}
return rootView;
}
然后它崩溃了:
public void seguentelement() {
switch (nivellactual) {
case 1:
TextView tvPregunta = (TextView) getActivity().findViewById(R.id.tvPregunta);
String pregunta = ("Quin element és el Hidrògen?");
tvPregunta.setText(pregunta);
// int de elemento es la imagebutton
elementcorrecte = (R.id.ibHidroJuego);
break;
希望你能找到我的错误。
答案 0 :(得分:2)
您不应该调用getActivity(),因为它返回父Activity而不是添加TextField的片段。
见http://developer.android.com/reference/android/app/Fragment.html#getActivity%28%29
相反,您可以通过调用 rootView 的findViewId()来创建全局变量TextField并在onCreateView()中实例化它。
注意:您的TextView布局 joc_fragment 对吗?
TextView tvPregunta;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.joc_fragment, container, false);
...
tvPregunta = (TextView) rootView.findViewById(R.id.tvPregunta); // instantiate here
berijuego=(ImageButton)rootView.findViewById(R.id.ibBeriJuego);
...
return rootView;
}
public void seguentelement() {
switch (nivellactual) {
case 1:
//
String pregunta = ("Quin element és el Hidrògen?");
tvPregunta.setText(pregunta);
// int de elemento es la imagebutton
elementcorrecte = (R.id.ibHidroJuego);
break;
}
...
}
答案 1 :(得分:0)
TextView tvPregunta = (TextView) getActivity().findViewById(R.id.tvPregunta);
这里没有生成tvPregunta的id所以你必须把它放在你的OnCreateView()上
TextView tvPregunta = (TextView) rootView.findViewById(R.id.tvPregunta);
答案 2 :(得分:0)
在Fragment类中,您将获得onViewCreated()覆盖方法,您应始终初始化视图,因为在此方法中您可以使用视图对象来查找您的视图,如下所示:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.yourId).setOnClickListener(this);
//or
getActivity().findViewById(R.id.yourId).setOnClickListener(this);
}
答案 3 :(得分:0)
您应该使用ButterKnife
将您的观点注入您的片段,如下所示:
public class YourFragment extends Fragment {
@InjectView(R.id.btnSave)
public Button saveButton;
@OnClick(R.id.btnSave)
public void save(View view) {
...
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_fragment, container, false);
ButterKnife.inject(this, rootView);
...
}
}
添加以下依赖项以将其用于build.gradle文件:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.jakewharton:butterknife:6.0.0'