2012-07-31 102 views
17

我有做一個片段交易安卓碎片無法獲得活動

DetailFragment newFragment = new DetailFragment(); 
transaction.replace(R.id.mylist, newFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

工作正常的活動。現在我知道在我的活動中,我需要在newFragment中的佈局中替換動態字符串。我以爲我能器transaction.commit後調用()只是像

newFragment.setMyString("my dynamic value"); 

而在newFragment.java我

public void setMyString(String s) 
{ 
TextView tv = (TextView) getActivity().findViewById(R.id.myobject); 
tv.setText(s); 
} 

的一點是,getActivity()返回null。我如何獲得我需要的環境來查找我的佈局元素?

編輯:

我儘量按照使用捆綁的路線,因爲這似乎是最徹底的方法。所以我改變了我的代碼:

Bundle b = new Bundle(); 
b.putString("text", "my dynamic Text"); 
DetailFragment newFragment = new DetailFragment(); 
transaction.replace(R.id.mylist, newFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

我的片段onCreateView看起來是這樣的:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    View v = inflater.inflate(R.layout.mylayout, container, false); 
    TextView t = (TextView) v.findViewById(R.id.texttobereplaced); 
    t.setText(savedInstanceState.getString("text"); 
} 

似乎savedInstranceState是空的。我應該在哪裏找到我的包?

EDIT2:

錯過了在答覆getArguments()。現在正在工作。

回答

17

Fragment沒有連接到Activity然而,這也意味着你的佈局不是招還沒有被充氣(見Fragment lifecycle)。這裏最好的解決方案是通過Fragment.setArguments(Bundle)方法將String值作爲參數添加到Fragment。這可以通過Fragment.getArguments()方法在接收Fragment中檢索。

+1

我的佈局充氣onViewCreated被調用。我可以看到我的佈局。 – AndyAndroid 2012-07-31 18:02:57

2

,所以我也使用相同的片段事務管理器,唯一的問題,我可以與你的代碼中看到的是你定義TextView的電視你對你的newFragment類的onCreateView方法裏面,然後實例它是這樣的:

public class AboutFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.newFragment, container, false); 
     TextView tv = (TextView) v.findViewById(R.id.textview); 
     return v; 
    } 

    public void setMyString(String s) { 
     tv.setText(s); 
    } 
} 

我知道這一點兒也不做真的太大的意義,但是那是多麼我運行我的代碼,它工作正常:)

+0

對不起,不知道這是重要的:)改變它..hopfully現在看起來更好 – Android2390 2012-07-31 15:38:24

+3

當然縮進你的代碼是重要的StackOverflow ...人們不會認爲你是一個非常可信的來源,如果你的代碼是公然不可讀的。我剛剛編輯了你的答案,並刪除了downvote。 – 2012-07-31 15:43:24

20

確保您在onAttach()之中或之後致電getActivity(),如之前那樣它將返回null

+0

對不起,我不明白我要在哪裏調用getActivity()並將它傳遞給我的setMyString()函數。如果我這樣做,你建議你仍然寫它可能會或可能不會返回null。我該如何理解這一點? – AndyAndroid 2012-07-31 18:05:49

+6

'片段'將被附加到'null'活動,直到'onActivityCreated' ...也就是說,如果你在'onCreate'或'onCreateView'中調用'getActivity()',它將返回'null',因爲'活動「尚未創建。因此,確保你在*'onActivityCreated'中或之後對'getActivity()'*進行了所有的調用。 – 2012-07-31 18:12:40

+4

這是錯誤的。一旦onAttach被調用getActivity()可以在不返回null的情況下被調用。 onActivityCreated只是完成活動時的回調,並且片段的佈局已經實例化。 – dymmeh 2014-04-03 15:35:19

0

如果u需要調用getActivity在OnCreateView,從onCreateView將所有我們的代碼,以onActivityCreate和只剩線

View v = inflater.inflate(R.layout.xxxx, container, false); 
    return v; 

在onCreateView

,但我有一個有趣的情況。

在我onActivityCreated

Spinner s1 = (Spinner) getActivity().findViewById(R.id.bitlength); 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
      getActivity(), R.array.bitlengths, 
      android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    s1.setAdapter(adapter); 

某個時刻onActivityCreated不會運行(正確!?),因此微調S1成爲空談。