2015-06-22 3 views
1

У меня возникла проблема с реализацией barcodefragmentlibv2 в моем проекте. Как сказано в названии, и из предыдущего опыта я знаю, что могу добавить его в фрагмент. Тем не менее, я все еще получаю ошибку NullPointerException, когда пытаюсь заставить этот фрагмент работать с моим приложением.Ошибка NullPointerException при добавлении фрагмента

Это часть кода отвечает за фрагмент штрих-кода: появляется

import android.support.v4.app.Fragment; 
//... 

public class CameraFragment extends Fragment implements IScanResultHandler { 
    BarcodeFragment fragment; 

    public static CameraFragment newInstance() { 
     CameraFragment fragment = new CameraFragment(); 
     return fragment; 
    } 

    public CameraFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.include_qrfragment, container, false); 
     fragment = (BarcodeFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.sample); 
     fragment.setScanResultHandler(this); 
     return view; 
    } 
//... 
} 

Ошибка в строке:

fragment.setScanResultHandler(this); 

Я также попытался заменить

getActivity().getSupportFragmentManager().findFragmentById(R.id.sample); 

в

getFragmentManager().findFragmentById(R.id.sample); 

но результат такой же.

Ниже приведены файлы разметки: fragment_camera

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" tools:context=".CameraFragment"> 

    <include 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     layout="@layout/include_qrfragment" /> 

    <TextView 
     android:id="@+id/status_view" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|center_horizontal" 
     android:layout_margin="15dp" 
     android:background="#99FFFFFF" 
     android:gravity="center" 
     android:padding="10dp" 
     android:text="@string/msg_default_status" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</FrameLayout> 

include_qrfragment

<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/sample" 
    android:name="com.abhi.barcode.frag.libv2.BarcodeFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" /> 

В начале я упомянул, что из моего собственного опыта, что это возможно. Правда в том, что я создал приложение, использующее эту функцию некоторое время назад, используя eclipse, и теперь я использую Android Studio - может быть, есть проблема?

EDIT 1:

Это целая Error в трассировки стека:

06-22 23:05:56.804 30578-30578/myapp.com.test E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.NullPointerException 
      at myapp.com.test.CameraFragment.onCreateView(CameraFragment.java:34) 
      at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740) 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
      at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458) 
      at android.os.Handler.handleCallback(Handler.java:587) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:130) 
      at android.app.ActivityThread.main(ActivityThread.java:3683) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:507) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
      at dalvik.system.NativeStart.main(Native Method) 
+0

Не могли бы вы отправить всю стек? – ElDuderino

+0

@ElDuderino Я добавил по запросу. – sebap123

+0

Что в строке 34? 'getActivity() ....' или 'fragment.setScanResultHandler (this);'? –

ответ

1

Проблема, кажется, лежит в этой строке:

fragment = (BarcodeFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.sample); 

Ваш фрагмент еще не добавляется к деятельности getActivity() является null в этой точке.

Может быть, вы должны переместить этот конкретный код onActivityCreated

+0

Исправьте меня, если я ошибаюсь, но я думаю, что тогда «NullPointerException» будет указывать на эта строка, потому что вы не можете вызывать метод ('getSupportFragmentManager()') на null. – sebap123

+0

Да, вы не можете вызвать какой-либо метод для нулевых объектов. – waqaslam

0

Вы должны раздувать только макет в CreateView, как это:

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

    return inflater.inflate(R.layout.your_layout, null); 

} 

Остальная часть вашего кода, вы должны положить его в onActivityCreated как сказал @waqaslam.

Вы получаете нулевой указатель, потому что еще нет раздутого макета.

+0

Я проверил его - все еще не работает, и все-таки эта ошибка. – sebap123

0

Я прочитал ваши ответы, и теперь я предполагаю, что вы попробовали или перенесли код getActivity(). GetSupportFragmentManager(). findFragmentById - onActivityCreated.

Единственный подозреваемый, который я вижу без загрузки вашего проекта, - это GUI ID. Вы назвали его sample или R.id.sample, что является подозреваемым в некоторых проектах.Возможно, у вас есть другой элемент пользовательского интерфейса с тем же именем/идентификатором. Если это так, то UI не может быть преобразован в фрагмент. Мое предложение - изменить имя идентификатора (с уникальным именем) и использовать его с findFragmentById().