2012-06-25 32 views
4

已經搜索過此內容,但其中的每個人都是針對onCreateView()方法的,您可以通過inflater訪問Fragments視圖。從外部訪問片段視圖OnCreateView方法

public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) 
{ 
    super.onCreateView(inflater, group, saved); 
    View view = inflater.inflate(R.layout.photosfrag, group, false); 

我想知道的是如何動態地做到這一點。例如說,我使用的是活動展現片段,並呼籲在該片段的方法,如:

public void setTitleText(String title) { 
    TextView nameView = (TextView)getView().findViewById(R.id.titleTxtView); 
    nameView.setText(title); 
} 

只是因爲已經創建的片段,這將是動態地改變它的方式。

任何幫助將是盛大的。我可能會做錯事。

編輯

這裏是崩潰日誌

06-25 17:31:37.343: D/AndroidRuntime(1009): Shutting down VM 
06-25 17:31:37.353: W/dalvikvm(1009): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
06-25 17:31:37.383: E/AndroidRuntime(1009): FATAL EXCEPTION: main 
06-25 17:31:37.383: E/AndroidRuntime(1009): java.lang.NullPointerException 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at com.corecoders.stuart.MainActivity.onTrackSelected(MainActivity.java:81) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at com.corecoders.stuart.HistoryFragment.onListItemClick(HistoryFragment.java:51) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at android.app.ListFragment$2.onItemClick(ListFragment.java:160) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at android.widget.AdapterView.performItemClick(AdapterView.java:292) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at android.widget.AbsListView.performItemClick(AbsListView.java:1058) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at android.widget.AbsListView$1.run(AbsListView.java:3168) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at android.os.Handler.handleCallback(Handler.java:605) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at android.os.Looper.loop(Looper.java:137) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
06-25 17:31:37.383: E/AndroidRuntime(1009):  at dalvik.system.NativeStart.main(Native Method) 
+0

有什麼問題你已經做什麼? –

+0

由於'空指針異常'導致崩潰 – StuStirling

+0

您應該在問題中包含您的崩潰日誌,並確保指出哪些行是日誌中引用的行。 –

回答

3

你這樣做的方式應該是正常的。崩潰日誌告訴我們,片段更新其小部件的方式與該片斷無關。

+0

感謝您的幫助。這是我引用片段的方式,我一定是做錯了 – StuStirling

+0

嘗試使用if((getSupportFragmentManager.findFragmentBy [Id | Tag]!= null),然後嘗試引用片段。 ** getSupportFragmentManager如果它使用兼容性lib和getFragmentManager如果不是,並且定位> 3.0 –

1

而是執行此操作:

//Define reference globally 
TextView nameView; 

public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved){ 
    super.onCreateView(inflater, group, saved); 
    View view = inflater.inflate(R.layout.photosfrag, group, false); 
    //do this here! 
    nameView = view.findViewByID(R.id.titleTxtView); 
    ... 

} 

public void setTitle(String t){ 
    nameView.setText(t); 
} 

不同的是這種方法不懶加載TextView reference--它在視圖膨脹時加載它,而不是在需要時加載。

+0

這很好,當然比OP更好。但與他的崩潰無關。 –

+0

有時候,這只是代碼污染 – ruX

-1

或使用getActivity方法。從文檔實例: View listView = getActivity().findViewById(R.id.list);

+0

我試過getActivity(),但它也是null。 – kimkevin

1

我有一個類似的問題,原來我重寫片段的getItem(int)方法,每次返回片段的新實例,你的情況我不知道,如果你也正在覆蓋但是,您應該檢查HistoryFragment.onListItemClick以查看您是否調用getItem方法並返回與您在屏幕上顯示的片段不同的新片段實例。

0

如果有人試圖在片段的類中訪問onCreateView之外的片段的佈局視圖,那麼您可以在類級別聲明膨脹視圖並在膨脹聲明後將其鏈接,並使用該視圖引用在Fragment類中的任何位置查找視圖:例如...........

public class FragmentA extends Fragment { 

//This will hold the inflated fragment layout 

    private View view; 

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

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 


    View view = inflater.inflate(R.layout.fragmenta, container, false); 
    this.view= view;// link this 'view' to our 'view' which we declared in class    

    setTextViewNow(); 

    return view; 

} 

private void setTextViewNow() { 

    //use 'view' to find the id of textview using findviewById(); 

    TextView myView = (TextView)view.findViewById(R.id.textViewMyView); 
    myView.setText("THis is set from outside oncreateView"); 
} 

}

+1

這僅僅是因爲從'onCreateView()'調用了'setTextViewNow()'。如果'setTextViewNow()'是從一個監聽器調用的,那麼''view'類成員將是null。 –