有 Java 编程相关的问题?

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

java不能在片段中声明按钮

我试图在我的应用程序上声明一个按钮(它位于一个片段上),我尝试的是:

TextView tvPregunta = (TextView) getActivity().findViewById(R.id.tvPregunta);

它不会给我一个错误,但当我启动应用程序时,它会

我的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 安卓.app.Fragment.performCreateView(Fragment.java:1700)
        at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
        at 安卓.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
        at 安卓.app.BackStackRecord.run(BackStackRecord.java:684)
        at 安卓.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
        at 安卓.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
        at 安卓.os.Handler.handleCallback(Handler.java:733)
        at 安卓.os.Handler.dispatchMessage(Handler.java:95)
        at 安卓.os.Looper.loop(Looper.java:136)
        at 安卓.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.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)

这一行是文本视图tvPregunta.:

at joancolmenero.taulaperiodica.com.taulaperiodicaapp.JocFragment.seguentelement(JocFragment.java:102)

这个是seguentelement();

at joancolmenero.taulaperiodica.com.taulaperiodicaapp.JocFragment.onCreateView(JocFragment.java:90)

seguentelement()它是由onCreateView创建的private void,所以我的问题是为什么这个文本视图会崩溃

我有一个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;

希望你能发现我的错误


共 (4) 个答案

  1. # 1 楼答案

    在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);
    
    }
    
  2. # 2 楼答案

    关于segunteElement()方法

    TextView tvPregunta = (TextView) getActivity().findViewById(R.id.tvPregunta);
    

    此处未生成tvPregunta的id,因此必须将其放在OnCreateView()上

     TextView tvPregunta = (TextView) rootView.findViewById(R.id.tvPregunta);
    
  3. # 3 楼答案

    您不应该调用getActivity(),因为它返回父活动,而不是添加TextField的片段
    http://developer.android.com/reference/android/app/Fragment.html#getActivity%28%29

    相反,您可以创建一个全局变量TextField,并通过调用根视图的findViewId()在onCreateView()中实例化它
    注意:您的文本视图位于布局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;
        }
        ...
    }
    
  4. # 4 楼答案

    您应该使用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);
                ...
            }
    }
    

    添加以下依赖项以将其用于生成。渐变文件:

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.jakewharton:butterknife:6.0.0'