2012-05-06 111 views
19

我是Android開發新手,當然還有片段。findViewById在使用片段時返回NULL

我想訪問的主要活動我的片段的控制,但「findViewById」返回null。沒有代碼的 代碼工作正常。

這裏是我的代碼部分:

片段

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    tools:ignore="HardcodedText" > 

    <EditText 
     android:id="@+id/txtXML" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:ems="10" 
     android:scrollbars="vertical"> 
    </EditText> 

</LinearLayout> 

MainActivity的OnCreate:

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

     this.initialisePaging(); 

     EditText txtXML = (EditText) findViewById(R.id.txtXML);} 

在這一點上txtXML爲空。

我的代碼中有什麼遺漏或我應該怎麼做?

+0

請將您的initialisePaging()方法發佈 – blacharnia

+0

''this.initialisePaging();''只需將片段添加到viewPager – mammadalius

回答

14

你應該inflateFragmentonCreateView方法片段的佈局,那麼你可以簡單地訪問它在你的ActivityfindViewById元素。

在本實施例我的片段佈局是一個的LinearLayout所以鑄inflate結果的LinearLayout。

public class FrgResults extends Fragment 
    { 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      //some code 
      LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.frg_result, container, false); 
      //some code 
      return ll; 
     } 
    } 
+1

什麼是一些代碼? – vasanth

+0

還要確保,如果你使用的是Android的支持v4,你可以使用'FragmentActivity'和'getSupportFragmentManager'來避免產生'null'。如果您只爲較新版本的Android API創建,則使用常規的「Activity」和方法「getSupportFragmentManager」。做*不*混合這兩種執行方式 –

2

1)試試這個:

Eclipse菜單 - >項目 - >清除...

更新

2)如果你有一個 '主' 佈局2分或更多的情況下,檢查是否所有的人都以「txtXML」身份證

3)

片段是在一塊應用程序的用戶的視圖可以放置在活動中的表面或行爲。與片段的交互通過FragmentManager完成,可以通過Activity.getFragmentManager()和Fragment.getFragmentManager()獲得。

片段類可用於許多方法來實現各種各樣的結果。它是核心,它代表在一個更大的活動中運行的特定操作或接口。片段與它所處的活動密切相關,不能單獨使用。儘管Fragment定義了自己的生命週期,但生命週期依賴於它的活動:如果活動停止,它內部的任何片段都不能啓動;當活動被破壞時,所有碎片都將被銷燬。

研究this。你必須使用FragmentManager。

+0

+1來解決我的另一個問題,但不是這個。 – mammadalius

+0

你有問題嗎? – breceivemail

+0

您是否只有一個「主」佈局的實例? – breceivemail

3

您不能findViewById訪問片段的視圖中的活動類,而不是你可以做的是...

你必須在你的活動文件片段類的一個對象,對不對?在該片段類中創建EditText類的getter方法,並在您的活動中訪問該方法。

在需要的EDITTEXT obj中的事件創建一個回調的片段類。

+0

我爲我的解決方案選擇Fragments以降低複雜度,同時提升性能,但看起來它變得更加複雜。 – mammadalius

+0

它不復雜...它功能強大,可以給你更多的靈活性 –

4

我來晚了,但對於其他人有這個問題。你應該在onCreateView方法中擴充你的視圖。然後覆蓋onCreateActivity方法,您可以在那裏使用getView().findViewById

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

你是對的。我的問題之前解決了。請展示一些其他人可以使用的充氣片段。 – mammadalius

+0

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

+0

親愛的@Futan請將您的評論作爲一個單獨的答案寫,並提供明確的描述以便對其他人有用,當然我可以選擇它作爲接受的答案。 – mammadalius

17

嘗試像這樣在您的片段上onCreateView

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

    if (container == null) { 
     return null; 
    } 

    LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.tab_frag1_layout, container, false); 
EditText txtXML = (EditText) ll.findViewById(R.id.txtXML); 

    return ll; 
} 
+0

這是之前解決的。我在尋找的是MainActivity上的txtXML,而不是Fragment本身。 – mammadalius

0

如果你想爲你在活動的onCreate使用使用findViewById,你可以簡單地把所有的overrided方法onActivityCreated。

+0

它在onActivityCreated方法中返回相同的null。 – hopeTo

+0

請給我看你的代碼 – Moesio