EditText在我的片段中返回null?

时间:2015-04-13 17:56:27

标签: android exception null android-edittext fragment

我正在做一个在片段之间传递数据的Android应用。在我的GradeListFragment上,我用不同的等级填充listView。当点击其中一个等级时,我会调出我的GradeInfoFragment,它将获得点击的等级并在屏幕上显示更详细的信息。 GradeInfoFragment包含四个正确显示的EditText字段,但问题是当我点击GradeListFragment中的成绩时,EditText字段在GradeInfoFragment上返回null。我在Activity中创建了包含两个片段和片段本身的方法来处理数据,除了我的GradeInfoFragment中的getData(GradeData thisGrade)方法之外,每个方法都很有效,它应该用适当的数据填充EditText字段。下面是我的代码和我的LogCat。再次感谢您,我已经坚持了一个多星期了!

GradeListActitivy.java

package bcs421.jorgeramirez.hwk.gradeapp.presentation;

import java.util.ArrayList;

import bcs421.jorgeramirez.hwk.gradeapp.businesslogic.GradeCollection;
import bcs421.jorgeramirez.hwk.gradeapp.businesslogic.GradeData;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.Surface;
import android.view.View;
import android.widget.EditText;
import android.support.v4.app.FragmentTransaction;


public class GradeListActivity extends FragmentActivity{


public GradeCollection gradeList;
public ArrayList<String> gradeCatList;
public GradeListFragment frag1 = new GradeListFragment();
public GradeInfoFragment frag2 = new GradeInfoFragment();
FragmentTransaction ft;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gradelist);

    Intent i = getIntent();
    gradeList = (GradeCollection) i.getSerializableExtra("grade_collection");
    gradeCatList = i.getStringArrayListExtra("grade_list");

    int rotation = getWindowManager().getDefaultDisplay().getRotation();





    if((rotation == Surface.ROTATION_90) || (rotation == Surface.ROTATION_270))
    {
        FragmentManager fm = getSupportFragmentManager();
        ft = fm.beginTransaction();
        ft.add(R.id.frag_container1, frag1, "list_frag");
        ft.add(R.id.frag_container2, frag2, "info_frag");
        ft.commit();

    }
    else
    {
        ft = getSupportFragmentManager().beginTransaction();
        ft.add(R.id.replace_this, frag1, "list_frag");
        ft.commit();
    }





}



public GradeCollection getGrades()
{
    return gradeList;
}

public ArrayList<String> getCatList()
{
    return gradeCatList;
}

public void replaceInfoFragment()
{
    FragmentTransaction fragT = getSupportFragmentManager().beginTransaction();
    fragT.replace(R.id.replace_this, frag2, "info_frag");
    fragT.addToBackStack(null);
    fragT.commit();

}

public GradeListFragment getListFrag()
{
    return frag1;
}

public GradeInfoFragment getInfoFrag()
{
    return frag2;
}


}

GradeListFragment.java

package bcs421.jorgeramirez.hwk.gradeapp.presentation;

import java.io.Serializable;
import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import bcs421.jorgeramirez.hwk.gradeapp.businesslogic.GradeCollection;
import bcs421.jorgeramirez.hwk.gradeapp.businesslogic.GradeData;


public class GradeListFragment extends Fragment implements Serializable {



SendGrades SG;
public GradeCollection collectedGrades;

@Override
public View onCreateView(   LayoutInflater inflater,
            ViewGroup container,
            Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.fragment_gradelist, container, false);
ListView lv = (ListView) v.findViewById(R.id.listViewGrades);

ArrayList<String> namesArrayList;
ArrayAdapter<String> namesArrayAdapter;


final Activity a = (GradeListActivity)getActivity();
collectedGrades = ((GradeListActivity) a).getGrades();
namesArrayList = ((GradeListActivity) a).getCatList();
namesArrayAdapter = new ArrayAdapter<String>(a, R.layout.item_gradelist, namesArrayList);
lv.setAdapter(namesArrayAdapter);
lv.setClickable(false);
lv.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        int currentOrientation = getResources().getConfiguration().orientation;
        if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
            GradeInfoFragment f2 = ((GradeListActivity) a).getInfoFrag();
            GradeData thisGrade = collectedGrades.GetItem(position);
            f2.getData(thisGrade);
        }
        else {
            ((GradeListActivity) a).replaceInfoFragment();
            GradeInfoFragment f2 = ((GradeListActivity) a).getInfoFrag();
            GradeData thisGrade = collectedGrades.GetItem(position);
            if(f2 == null)
            {
                Log.e("Error!", "F2 is null!");
            }
            if(thisGrade == null)
            {
                Log.e("Error!", "thisGrade is null!");
            }
            f2.getData(thisGrade);


        }


    }
    });


return v;
}










}

GradeInfoFragment.java

package bcs421.jorgeramirez.hwk.gradeapp.presentation;

import java.util.ArrayList;

import bcs421.jorgeramirez.hwk.gradeapp.businesslogic.GradeCollection;
import bcs421.jorgeramirez.hwk.gradeapp.businesslogic.GradeData;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

public class GradeInfoFragment extends Fragment {


public GradeCollection collectedGrades;
private EditText categoryText, numberText, gradeText, descText;
private View v;


@Override
public View onCreateView(   LayoutInflater inflater,
            ViewGroup container,
            Bundle savedInstanceState) {

v = inflater.inflate(R.layout.fragment_gradeinfo, container, false);

Activity a = (GradeListActivity)getActivity();

collectedGrades = ((GradeListActivity) a).getGrades();



categoryText = (EditText)v.findViewById(R.id.editCat);
numberText = (EditText)v.findViewById(R.id.editNumber);
gradeText = (EditText)v.findViewById(R.id.editGrade);
descText = (EditText)v.findViewById(R.id.editDesc);
categoryText.setText(" ");
numberText.setText(" ");
gradeText.setText(" ");
descText.setText(" ");



return v;
}


public void getData(GradeData thisGrade)
{
    double gd = thisGrade.getGrade();
    String gValue = Double.toString(gd);
    if(categoryText == null)
    {
        Log.e("Error!", "categoryText is null!");
    }
    categoryText.setText(thisGrade.getCategory());
    numberText.setText(thisGrade.getNumber());
    gradeText.setText(gValue);
    descText.setText(thisGrade.getDescription());
}



}

fragment_gradeinfo.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/textCat"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/cat_label"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/editCat"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:ems="10" >

        <requestFocus />
    </EditText>

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/textNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/num_label"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/editNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:ems="10" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/textGrade"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/grade_label"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/editGrade"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:ems="10" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/textDesc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/desc_label"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/editDesc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:ems="10" />

</LinearLayout>

</LinearLayout>

logcat的

04-13 13:42:31.211: E/Error!(2367): categoryText is null!
04-13 13:42:31.211: D/AndroidRuntime(2367): Shutting down VM
04-13 13:42:31.211: W/dalvikvm(2367): threadid=1: thread exiting with uncaught exception (group=0xb1d66b20)
04-13 13:42:31.211: E/AndroidRuntime(2367): FATAL EXCEPTION: main
04-13 13:42:31.211: E/AndroidRuntime(2367): Process: bcs421.jorgeramirez.hwk.gradeapp.presentation, PID: 2367
04-13 13:42:31.211: E/AndroidRuntime(2367): java.lang.NullPointerException
04-13 13:42:31.211: E/AndroidRuntime(2367):     at bcs421.jorgeramirez.hwk.gradeapp.presentation.GradeInfoFragment.getData(GradeInfoFragment.java:63)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at   bcs421.jorgeramirez.hwk.gradeapp.presentation.GradeListFragment$1.onItemClick(GradeListFragment.java:71)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at android.widget.AdapterView.performItemClick(AdapterView.java:299)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at android.widget.AbsListView$3.run(AbsListView.java:3638)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at android.os.Handler.handleCallback(Handler.java:733)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at android.os.Handler.dispatchMessage(Handler.java:95)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at android.os.Looper.loop(Looper.java:136)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at android.app.ActivityThread.main(ActivityThread.java:5017)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at java.lang.reflect.Method.invoke(Method.java:515)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-13 13:42:31.211: E/AndroidRuntime(2367):     at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:1)

我很抱歉在这里使用答案空间,但无法发表评论,因为我没有足够的声誉来发表评论。

评论 - 在GradeListFragment.onItemClick中调用getData之前,我没有看到你初始化信息片段。您必须首先初始化它,或者至少获取editText并在方法中传递它们。截至目前,它将为null,因为实际上并未创建信息片段,也就是说,在调用它的onCreate方法之前,您正试图从该视图容器中获取EditText。

首先尝试创建该片段,然后调用getData()。完成初始化EditText字段后,您还可以从onCreate()内部调用getData()。

答案 1 :(得分:0)

创建片段实例(使用new)不会调用onCreateView方法。当您致电getData时,textView尚未初始化,并且您获得了空例外。