2

我想從一個片段到另一個片段將TextTextText設置爲Textview。Android從另一個片段設置Textview

我該怎麼做?現在,我得到一個:顯示java.lang.NullPointerException:試圖調用虛擬方法無效android.widget.TextView.setText(java.lang.CharSequence中的)'對空對象引用

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和調用該方法從另一個片段拍攝片段實例之後的片段的方法。 – AAnkit

+2

看看這個:https://stackoverflow.com/questions/17436298/how-to-pass-a-variable-from-activity-to-fragment-and-pass-it-back 你可以傳遞字符串到帶有'setArguments(Bundle)'方法的片段。 –

+0

所以我做了一個方法,但它仍然給我一個nullpointerEcxeption。你能看看我更新的問題嗎? @AndreiVerdes –

回答

0

您可以管理您使用總線實現片段和活動之間的所有行動。本教程將幫助您! Tutroial...

1

您正在獲取空指針異常,因爲您的視圖在調用onCreateView之後被誇大了。 您應該在ListClickedFrgament的構造函數中傳遞一個Bundle或String參數,然後使用它來設置文本。

ListClickedFragment:

String textToSet; 
    public ListClickedFragment(String text) { 
      this.textToSet = text; 
    } 

設置這個文本在ListClickedFragment的OnViewCreated方法您的TextView。

在fragmentRonde1:

ListClickedFragment fragmentRonde1 = new ListClickedFragment(c2.getString(c2.getColumnIndex("title"))); 

希望這有助於。

+0

所以,你把this.textToSet這是我把我的textview和settext文本?我還沒有完全理解,但我看到你要去哪裏了@hadi –

+0

沒有Justin,關鍵是textview是一個UI組件,你只能在onCreateView方法完成後才能得到它的引用。你要做的是在你的ListClickedFragment中覆蓋onViewCreated方法,在該方法中你可以使用_textToSet_字符串並將其設置爲你的textview。 – Hadi

+0

我明白你的意思了!如果它有效,我會嘗試並接受答案! @hadi –

0

步驟1

在片段A,使用callback獲得訪問活動。你可以從這裏學習如何使用它。 Fragment Callbacks

步驟2

在活動中,使用FragmentManager找到片段B,然後你就可以在片段B獲得訪問TextView

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

找到tvTitle您的活動,而不是片段

1

試試這個: 我在這裏做了一些推測,我不明白爲什麼你有2個相同片段的實例......並且你沒有一個trans與第二個動作(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

如果一定要在1小時或2小時後回家試試這個!@AndreiVerdes –

相關問題