2014-04-13 140 views
0

我目前還不熟悉Android開發,並遇到以前的研究無法幫助我解決的問題。我在Android活動使用findViewById()搶在活動的相應的XML片段文件中聲明,像這樣一個TextView對象:findViewById()返回null

public void scanLocalApk() { 
    //get the list of apks in the default downloads directory 
    ArrayList<File> foundAPKs = findApksInDownloadDirectory(); 
    //display the list of found apks 
    String apkListString = ""; 
    if (foundAPKs != null) 
     for (File f : foundAPKs) 
      apkListString += (f.getName() + "\n"); 
    TextView displayApksTextView = (TextView) findViewById(R.id.display_apks); 
    displayApksTextView.setText(apkListString); 
    TextView apkToInstallTextView = (TextView) findViewById(R.id.label_apk_to_install); 
    apkToInstallTextView.setVisibility(View.VISIBLE); 
    EditText apkToInstallEditText = (EditText) findViewById(R.id.apk_to_install); 
    apkToInstallEditText.setVisibility(View.VISIBLE); 
} 

一個NullPointerException異常被這一行拋出: displayApksTextView.setText(apkListString) ;因爲上面一行中的findViewById調用返回null。

資源「display_apks」在「fragment_scan_local_apk.xml」定義如下:

<TextView android:id="@+id/display_apks" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"/> 

各地的網絡前面提到的解決方案都表示保證的setContentView()以上findViewById()被調用,但在我代碼是。

有沒有人有什麼問題可能是什麼?

編輯:根據要求,我調用的setContentView()這裏

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_scan_local_apk); 

    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.container, new PlaceholderFragment()).commit(); 
    } 

    //branch to a logic method 
    scanLocalApk(); 
} 
+0

你可以在你調用setContentView方法的地方提供代碼嗎? – Zyn

+0

已修改。謝謝參觀。 – MawrCoffeePls

+0

啊,這確實有道理,但是我怎樣才能從片段的視圖層次中找到一個視圖?或者我應該將組件定義從片段的xml文件移動到活動的xml文件中? – MawrCoffeePls

回答

5

在你的碎片的佈局XML的意見是被誇大到碎片的觀層次,這將不會被添加到該活動的層次結構,直到onAttach()回調,所以在Activity的上下文中的findViewById()將在調用onCreate()時返回null。

如果你想保持在該片段中的意見,倒不如叫findViewById()對從片段中的onCreateView()方法返回的視圖,移動視圖功能,並引用的片段。

如果您不想/不需要使用分段,您可以將fragment_scan_local_apk.xml中的視圖移動到activity_scan_local_apk.xml,並將其餘代碼保持原樣。如果您決定使用此選項,則可以刪除PlaceholderFragment的代碼。

+0

你是最棒的,男人。我將組件定義移到活動xml文件中,現在我運行得非常完美。謝謝您的幫助。 – MawrCoffeePls