我正在做一个在片段之间传递数据的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)
答案 0 :(得分:1)
我很抱歉在这里使用答案空间,但无法发表评论,因为我没有足够的声誉来发表评论。
评论 - 在GradeListFragment.onItemClick中调用getData之前,我没有看到你初始化信息片段。您必须首先初始化它,或者至少获取editText并在方法中传递它们。截至目前,它将为null,因为实际上并未创建信息片段,也就是说,在调用它的onCreate方法之前,您正试图从该视图容器中获取EditText。
首先尝试创建该片段,然后调用getData()。完成初始化EditText字段后,您还可以从onCreate()内部调用getData()。
答案 1 :(得分:0)
创建片段实例(使用new
)不会调用onCreateView
方法。当您致电getData
时,textView
尚未初始化,并且您获得了空例外。