2014-03-04 130 views
0

我只有使用Android 4.1.2崩潰,在setVisibility一個NullPointerException一些設備的應用程序:的Android 4.1.2 findViewById返回null

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     inflater.inflate(R.menu.detail, menu); 
     if (mDocumento.getPathPdfDevice()==null) { 
      getActivity().findViewById(R.id.btnBigDownloading).setVisibility(View.GONE); 
     } 
} 

但在所有其他設備工作正常。

只有一個佈局加載這樣的:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    setHasOptionsMenu(true); 
    View rootView = inflater.inflate(R.layout.fragment_detail, container, false); 
    return rootView; 
} 

的佈局:

<LinearLayout 
      android:id="@+id/btnBigDownloading" 
      android:visibility="gone" 
      android:orientation="vertical" 
      android:layout_gravity="center" 
      android:layout_width="0dp" 
      android:padding="10dp" 
      android:layout_height="match_parent" 
      android:layout_weight=".30" > 

      <ProgressBar 
       android:id="@+id/btnBigDownloadingProgress" 
       android:layout_gravity="center" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:indeterminate="true" 
       /> 

     </LinearLayout> 
+0

那麼,什麼是空指針?如果存在NullPointerException,則表示該行中的某個值未聲明或等於null。你確定當這段代碼執行時,'btnBigDownloading'實際上存在嗎? –

+0

我已添加布局。 ,但正如我所說的相同的代碼工作正常(沒有nullpointer)在其他版本(從2.3.3到4.4).. getActivity()。findViewById(R.id.btnBigDownloading)返回對象 –

回答

0

在onCreateOptionsMenu()中做這件事不是一個好主意。

一個適當的解決方案是創建一些方法,將顯示進度條數據加載時,從onPrepareOptionsMenu叫他們()

ProgressBar progressBar; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 
    View v = inflater.inflate(R.layour.your_layut, container, false); 
    progressBar = v.findViewById(R.id.btnBigDownloading); 
    return v; 
} 

@Override 
public void onPrepareOptionsMenu(Menu menu){ 
    super.onPrepareOptionsMenu(Menu menu); 
    showProgressBar(); 

} 

private void showProgressBar(){ 
    if (mDocumento.getPathPdfDevice()==null && progressBar()!=null) { 
     progressBar.setVisibility(View.GONE); 
    } 
} 
3

最可能的原因是,在這些設備中,onCreateOptionsMenu()方法被前觸發onCreateView()方法被調用。解決此問題的最佳方法是在onCreateView()方法中包含if-else邏輯,以確保在檢查此條件之前佈局已充滿。

+0

我試過,但日誌說方法的順序是正確的 –