【问题标题】:TextView is always null in my Fragment when I try and setText it crashes当我尝试 setText 崩溃时,我的 Fragment 中的 TextView 始终为空
【发布时间】:2014-10-28 19:20:53
【问题描述】:

我有一个应用程序,它有 1 个调用 2 个片段的主要活动。 1 个片段有一个列表视图,如果您单击一个项目,它应该会打开一个新片段,其中包含基于所单击项目索引的信息。当我尝试更改第二次片段调用中的文本时,我的应用程序崩溃了。

主活动:

public class MyActivity extends Activity implements Communicator {

FragmentManager manager;
FragmentTransaction transaction;
FriendsFragment friendsFrag;
FeedFragment feedFrag;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    friendsFrag = new FriendsFragment();
    feedFrag = new FeedFragment();

    manager = getFragmentManager();
    transaction = manager.beginTransaction();
    transaction.add(R.id.fragment_container, friendsFrag, "friendsFrag");
    transaction.commit();
}

@Override
public void startFragment(int i) {

    manager = getFragmentManager();
    //FeedFragment frag = (FeedFragment) manager.findFragmentById(R.id.feedFrag);

    transaction = manager.beginTransaction();
    transaction.replace(R.id.fragment_container, feedFrag);

    transaction.addToBackStack(null);
    transaction.commit();
    feedFrag.updateFeedDisplay(i);
}

}

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

</LinearLayout>

第一个被调用的片段:

public class FriendsFragment extends ListFragment implements AdapterView.OnItemClickListener {

Communicator com;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)     {
    return inflater.inflate(R.layout.friendsfragment, container, false);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    com = (Communicator)activity;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    //com = (Communicator)getActivity();
    ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(), R.array.test, android.R.layout.simple_list_item_1);

    setListAdapter(adapter);

    getListView().setOnItemClickListener(this);
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    com.startFragment(position);
   // Toast.makeText(getActivity(), "ITem: " + position, Toast.LENGTH_LONG).show();
}


}

<?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">

<ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@android:id/list"/>
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@android:id/empty"
        android:layout_gravity="left|center_vertical"/>
</LinearLayout>

第二个片段:

public class FeedFragment extends Fragment {

FeedFragmentData feed;
private static TextView fedTV;
//Communicator com;

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

 //   LayoutInflater lf = getActivity().getLayoutInflater();
    //return inflater.inflate(R.layout.feedfragment, container, false);
    View v = inflater.inflate(R.layout.feedfragment, container, false);
    //fedTV = (TextView) v.findViewById(R.id.fedTV);
    feed = new FeedFragmentData(getActivity());
    //fedTV.setText(feed.getFeed(0));
    return v;
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    //com = (Communicator)activity;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
//     feed = new FeedFragmentData(getActivity());
    fedTV = (TextView) getActivity().findViewById(R.id.fedTV);
}

public void updateFeedDisplay(int position) {

   // Toast.makeText(this, "HIii", Toast.LENGTH_LONG).show();

   // fedTV = (TextView) getActivity().findViewById(R.id.fedTV);
    if (fedTV != null) {
        fedTV.setText("Haa");
    }


}

}

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          >

<TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="text"
        android:id="@+id/fedTV"/>
</ScrollView>

当我删除 if (fedTV != null) 并只删除 setText 时,我会产生此错误。如果我有 if 语句,那么文本字段永远不会改变 Logcat 错误:

        java.lang.NullPointerException
        at albert.kim.fragments.FeedFragment.updateFeedDisplay(FeedFragment.java:53)
        at albert.kim.fragments.MyActivity.startFragment(MyActivity.java:41)
        at albert.kim.fragments.FriendsFragment.onItemClick(FriendsFragment.java:47)
        at android.widget.AdapterView.performItemClick(AdapterView.java:308)
        at android.widget.AbsListView.performItemClick(AbsListView.java:1483)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:3485)
        at android.widget.AbsListView$3.run(AbsListView.java:4843)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5356)
        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:1265)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
        at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 从您调用updateFeedDisplay() 方法的位置。从其他片段来看,这可能是NPE的原因。
  • @user370305 我认为这是错误。但是在我调用方法的主要活动中,我在 transaction.commit() 之后调用它。我试过把它放在之前,之后。如何在 oncreateview 之后调用该方法?
  • @user370305 但从片段-> 活动-> 片段2 传递信息不是正确的约定吗?这就是我设置它的方式,但它不起作用。由于某种原因,我的方法在片段被实例化之前被调用。
  • 为什么有些行被注释掉了,但它们是必不可少的?就像初始化时一样:fedTV = (TextView) getActivity().findViewById(R.id.fedTV);

标签: android android-fragments


【解决方案1】:

我在 updateFeedDisplay() 方法中实例化了 fedTV,并将声明从私有静态更改为私有。这次成功了……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多