从另一个fragment设置Android的Textview

3

我想从一个片段向另一个片段的TextView设置文本。

我该怎么做?目前我遇到了一个错误:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

FragmentRonde1.java

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

            ListClickedFragment newFragment = new ListClickedFragment();
            FragmentTransaction transaction = getFragmentManager().beginTransaction();

            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            transaction.commit();

            Cursor c2 = db.getIdOfSelectedItem(id);

            ListClickedFragment fragmentRonde1 = new ListClickedFragment();

            if (c2 != null) {
                c2.moveToFirst();

                // i want to set listClickedTitle from here but listClickedTitle is in ListClickedFragment
                fragmentRonde1.gettext(c2.getString(c2.getColumnIndex("title")));

            }

        }
    });

这是ListClickedTitle所在片段的类:ListClickedFragment
public class ListClickedFragment extends android.support.v4.app.Fragment {

TextView tvTitle, tvDesc, tv, oop;


public ListClickedFragment() {
    // Required empty public constructor
}




@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final View rootview2 = inflater.inflate(R.layout.fragment_list_clicked, container, false);

    tvTitle = (TextView)getActivity().findViewById(R.id.listClickedTitle);

    return rootview2;
}

public void gettext (String text) {

    tvTitle.setText(text);

}
}

LOGCAT

    10-28 09:37:25.373 14349-14349/justin.drawer E/InputEventReceiver: Exception dispatching input event.
10-28 09:37:25.381 14349-14349/justin.drawer E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at justin.drawer.ListClickedFragment.gettext(ListClickedFragment.java:40)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at justin.drawer.FragmentRonde1$1.onItemClick(FragmentRonde1.java:71)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.widget.AdapterView.performItemClick(AdapterView.java:310)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.widget.AbsListView$PerformClick.run(AbsListView.java:3042)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.widget.AbsListView.onTouchUp(AbsListView.java:3891)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.widget.AbsListView.onTouchEvent(AbsListView.java:3656)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.View.dispatchTouchEvent(View.java:9294)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2547)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2240)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.app.Activity.dispatchTouchEvent(Activity.java:2765)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.View.dispatchPointerEvent(View.java:9514)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4230)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4096)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5922)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5896)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5857)
10-28 09:37:25.420 14349-14349/justin.drawer E/MessageQueue-JNI:    at android.view.ViewRootImpl$WindowInputEventReceive
10-28 09:37:25.420 14349-14349/justin.drawer D/AndroidRuntime: Shutting down VM

1
显然这是一个空对象,尝试在包含TextView的Fragment中创建一个方法,并在从另一个Fragment获取Fragment实例后调用该方法。 - AAnkit
2
看一下这个:https://dev59.com/WGQm5IYBdhLWcg3wqwfn 你可以使用setArguments(Bundle)方法将字符串传递给片段。 - Andrei Verdes
我已经写了一个方法,但它仍然给我一个nullpointerEcxeption。你能看一下我的更新问题吗?@AndreiVerdes - Joestoen
5个回答

1
你之所以收到空指针异常,是因为你的视图在onCreateView被调用后才被充气。你应该在ListClickedFragment的构造函数中传递一个Bundle或String参数,然后使用它来设置文本。
    String textToSet;
    public ListClickedFragment(String text) {
           this.textToSet = text;
    }

在ListClickedFragment的OnViewCreated方法中将此文本设置为您的TextView。
在fragmentRonde1中:
    ListClickedFragment fragmentRonde1 = new ListClickedFragment(c2.getString(c2.getColumnIndex("title")));

希望这有所帮助。

所以,你把 this.textToSet 放在哪里,那就是我放我的textview并设置文本的地方?我还没有完全理解,但我知道你想表达什么。@hadi - Joestoen
不要想当然,关键是TextView是一个UI组件,在onCreateView方法完成之后才能获取它的引用。你需要在ListClickedFragment中重写onViewCreated方法,在该方法中可以使用_textToSet_字符串,并将其设置为你的TextView。 - Hadi
我明白你的意思!我会尝试一下,如果有效的话就接受为答案!@hadi - Joestoen
一直在尝试,但仍然遇到了空指针异常 :( 而且也无法在bundle中运行。@hadi - Joestoen
替换此行代码: tvTitle = (TextView)getActivity().findViewById(R.id.listClickedTitle); - Hadi

1
tvTitle = (TextView)getActivity().findViewById(R.id.listClickedTitle);

在您的活动中查找tvTitle,而不是片段。

1
尝试这样做: 我在这里做了一些假设,我真的不理解为什么你有两个相同的片段实例...而且你没有和第二个(fragmentRonde1)进行事务...这在活动中不会显示...我有点困惑,但也许这可以帮助。
编辑: 为什么第二次会出现NullPointerException?因为你只调用了ListClickedFragment fragmentRonde1的构造函数。如果不对它进行事务处理,不在一些FrameLayout中添加/替换它,就不会触发onCreateView()...视图不会被膨胀,因此TextView将为空。
lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        ListClickedFragment newFragment = ListClickedFragment.newInstance();
        FragmentTransaction transaction = getFragmentManager().beginTransaction();

        transaction.replace(R.id.fragment_container, newFragment);
        transaction.addToBackStack(null);

        transaction.commit();

        Cursor c2 = db.getIdOfSelectedItem(id);

        ListClickedFragment fragmentRonde1;

        if (c2 != null) {
            c2.moveToFirst();
            fragmentRonde1 = ListClickedFragment.newInstance(c2.getString(c2.getColumnIndex("title")));
        } else {
            fragmentRonde1 = ListClickedFragment.newInstance();
        }

    }
});

和这个

public class ListClickedFragment extends android.support.v4.app.Fragment {

public static final String STRING_TAG = "some_tag_in_here";

public static ListClickedFragment newInstance() {
    return new ListClickedFragment();
}

public static ListClickedFragment newInstance(String pString) {
    ListClickedFragment listClickedFragment = newInstance();
    Bundle bundle = new Bundle();
    bundle.putString(STRING_TAG, pString);
}

TextView tvTitle;
TextView tvDesc;
TextView tv;
TextView oop;

public ListClickedFragment() {
}

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                   Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final View rootview2 = inflater.inflate(R.layout.fragment_list_clicked, container, false);

    tvTitle = (TextView) getActivity().findViewById(R.id.listClickedTitle);
    if (getArguments() != null && getArguments().getString(STRING_TAG) != null) {
        tvTitle.setText(getArguments().getString(STRING_TAG));
    }
    return rootview2;
}
}

1
我会在一两个小时后回家时尝试这个!@AndreiVerdes - Joestoen

0

步骤1

在片段A中,使用回调来访问活动。您可以从这里了解如何使用它。 片段回调函数

步骤2

在活动中,使用FragmentManager查找片段B,然后就可以访问片段B中的TextView了。


0
你可以使用 Bus 实现来管理片段和活动之间的所有操作。本教程将为您提供帮助!教程...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接