2014-03-04 103 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

我试过,但日志说方法的顺序是正确的 –