2014-10-13 2 views
1

Я пытаюсь реализовать фрагменты в своем приложении. Проблема возникает, когда я меняю вкладки (я использую макет ящика), я получаю ошибку java.lang.NullPointerException. Я проверил код на основной активности, и он работал плавно. единственная проблема заключается в том, когда я применяю его к фрагменту. вот код:java.lang.NullPointerException с андроидным фрагментом

import android.app.Fragment; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.*; 

public class FragW extends Fragment { 
    Spinner spinwatt ; 
    Button calculate; 
    EditText wattEdit; 
    EditText costEdit; 
    TextView resultText; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragw,container,false); 
     calculate = (Button) getView().findViewById(R.id.calculate); 
     wattEdit = (EditText) getView().findViewById(R.id.wattEdit); 
     costEdit = (EditText) getView().findViewById(R.id.costEdit); 

     calculate.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       float wattVar = Float.parseFloat(wattEdit.getText().toString()); 
       float costvar = Float.parseFloat(costEdit.getText().toString()); 

       if (spinwatt.getSelectedItem().toString().equals("µW")) 
        wattVar = wattVar * (float) 0.000001; 
       else if (spinwatt.getSelectedItem().toString().equals("mW")) 
        wattVar = wattVar * (float) 0.001; 
       else if (spinwatt.getSelectedItem().toString().equals("kW")) 
        wattVar = wattVar * 1000; 
       String resultvar = Float.toString(costvar * wattVar); 
       resultText.setText(resultvar); 

      } 



     }); 
     spinwatt = (Spinner)getView().findViewById(R.id.spinwatt); 
     ArrayAdapter<CharSequence> wattAdapter = ArrayAdapter.createFromResource(getActivity(), 
       R.array.wattArray, android.R.layout.simple_spinner_item); 
     wattAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinwatt.setAdapter(wattAdapter); 

     return v; 

    } 

Здесь представлен LogCat

10-13 12:27:13.429 2563-2563/az.test2 D/gralloc_goldfish﹕ Emulator without GPU emulation detected. 
10-13 12:27:31.468 2563-2563/az.test2 D/AndroidRuntime﹕ Shutting down VM 
10-13 12:27:31.468 2563-2563/az.test2 W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x409961f8) 
10-13 12:27:31.488 2563-2563/az.test2 E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.NullPointerException 
     at az.test2.FragW.onCreateView(FragW.java:25) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:795) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998) 
     at android.app.BackStackRecord.run(BackStackRecord.java:622) 
     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1330) 
     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:417) 
     at android.os.Handler.handleCallback(Handler.java:605) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4340) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
     at dalvik.system.NativeStart.main(Native Method) 

Line 25: calculate = (Button) getView().findViewById(R.id.calculate);. однако все строки, подобные этому, вызывают эту ошибку (строки 25, 26, 27, 55). Я также попытался инициализировать переменные с помощью определений (в строках с 16 по 20). Я все же получил ту же ошибку. Пожалуйста, скажите мне, что делать.

+1

еще один вопрос о getView внутри onCreateView – Selvin

+0

getView имеет значение null в onCreateView(), потому что вы не вернули представление. используйте в onActivityCreated() или используйте ** v ** вместо getView() –

ответ

5

изменить это

calculate = (Button) getView().findViewById(R.id.calculate); 
    wattEdit = (EditText) getView().findViewById(R.id.wattEdit); 
    costEdit = (EditText) getView().findViewById(R.id.costEdit); 

в

calculate = (Button) v.findViewById(R.id.calculate); 
    wattEdit = (EditText) v.findViewById(R.id.wattEdit); 
    costEdit = (EditText) v.findViewById(R.id.costEdit); 

инициализируется ваши взгляды с надутым видом на Fragment

2

Ваше мнение еще не создан, так getView() равна нулю, поэтому изменить

calculate = (Button) getView().findViewById(R.id.calculate); 
wattEdit = (EditText) getView().findViewById(R.id.wattEdit); 
costEdit = (EditText) getView().findViewById(R.id.costEdit); 
spinwatt = (Spinner)getView().findViewById(R.id.spinwatt); 

в

calculate = (Button) v.findViewById(R.id.calculate); 
wattEdit = (EditText) v.findViewById(R.id.wattEdit); 
costEdit = (EditText) v.findViewById(R.id.costEdit); 
spinwatt = (Spinner)v.findViewById(R.id.spinwatt); 
3

В onCreateView(), getView() возвращается null, как вы еще не вернули вид рамки.

Звоните findViewById() на Viewv Вместо этого вы просто завышены.

+0

Спасибо за вашу помощь, это заставило меня понять мою ошибку. –

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