0

Я создаю приложение простого сканирования QR, используя навигационный ящик, чтобы перейти на разные фрагменты, для части QR-сканирования я использую библиотеку ZXing Scanner.Android - Изменение содержимого содержимого активности навигационного ящика

В одном из фрагментов, есть кнопка под названием «сканирование», при нажатии на следующий запуск кода

mScannerView = new ZXingScannerView(this); 
setContentView(mScannerView); // HERE IS THE begining OF THE PROBLEM 
mScannerView.setResultHandler(this); 
mScannerView.startCamera(); 

сейчас в handleResult методы я должен написать следующий код, чтобы закрыть камеру.

mScannerView.stopCamera(); 
setContentView(R.layout.activity_main); // THE PROBLEM OCCUERS HERE 

Когда я запускаю этот код я получаю Binary XML file line #36: Binary XML file line #36: Error inflating class fragment

Любая идея, как решить эту проблему?

Код:

Основная деятельность:

public class MainActivity extends AppCompatActivity implements FragmentDrawer 
    .FragmentDrawerListener, ZXingScannerView.ResultHandler { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    drawerFragment = (FragmentDrawer) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
    drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id 
      .drawer_layout), mToolbar); 
    drawerFragment.setDrawerListener(this); 

    displayView(0); 
} 

@Override 
public void onDrawerItemSelected(View view, int position) { 
    displayView(position); 
} 

private void displayView(int position) { 
    Fragment fragment = null; 
    switch (position) { 
     case 0: 
      fragment = new QRScanerFragment(); 
      title = getString(R.string.title_logout); 
      break; 
     default: 
      break; 
    } 

    if (fragment != null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.container_body, fragment); 
     fragmentTransaction.commit(); 
    } 
} 

public void scan(View view) { 
    mScannerView = new ZXingScannerView(this); 
    setContentView(mScannerView); 
    mScannerView.setResultHandler(this); 
    mScannerView.startCamera(); 
} 

@Override 
public void handleResult(Result result) { 
    Log.e("QR result", result.getText()); 
    mScannerView.stopCamera(); 
    setContentView(R.layout.activity_main); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    mScannerView.stopCamera(); 
} 

}

как и для XML:

<android.support.v4.widget.DrawerLayout 
xmlns:app="http://schemas.android.com/apk/res-auto         xmlns:tools="http://schemas.android.com/tools" 
            android:id="@+id/drawer_layout" 
            android:layout_width="match_parent" 
            android:layout_height="match_parent"> 


<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <FrameLayout 
     android:id="@+id/container_body" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" /> 


</LinearLayout> 


<fragment 
    android:id="@+id/fragment_navigation_drawer" 
    android:name="com.bassiouny.androidqrtask.fragments.FragmentDrawer" 
    android:layout_width="@dimen/nav_drawer_width" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    app:layout="@layout/fragment_navigation_drawer" 
    tools:layout="@layout/fragment_navigation_drawer" /> 

+1

Возможно, я бы несколько раз не позвонил 'setContentView()', так как это приведет к перерисовке всего представления. Почему бы не вызвать камеру в отдельном фрагменте, или если вы снова рисуете весь экран, почему бы просто не начать новое действие (для результата)? Во всяком случае, насколько актуальна проблема, покажите код. Что находится в вашем XML-файле и что класс фрагмента выглядит так, что он пытается раздуть? – Bryan

+0

Конечно, вы получите ошибку с setContentView(), вы не можете сделать это таким образом, чтобы начать новую деятельность или как @Bryan сказал фрагмент – has19

+0

@Bryan, я добавил код, я пытаюсь найти способ что позволит мне использовать как библиотеку QR-сканера, так и навигационный ящик, поэтому я не звоню в камеру, так как мне нужно это бросить в библиотеку. –

ответ

0

Быстрый взгляд на source показано, что ZXingScannerView является потомком класса View. Поэтому вы должны быть в состоянии создать макет так:

<me.dm7.barcodescanner.zxing.ZXingScannerView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent" 
    android:id="@+id/scanner"/> 

Тогда вы можете создать ScannerFragment, который использует этот формат, как его взгляд:

@Override 
public view onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_scanner, container, false); 
    mScannerView = (ZXingScannerView) view.findViewById(R.id.scanner); 

    return view; 
} 

Затем, вместо вызова setContentView снова в вашем Activity , вы можете заменить фрагмент с ScannerFragment, так же, как вы с другими фрагментами:

Fragment fragment = ScannerFragment.newInstance(); 

FragmentTransaction fragmentManager = getSupportFragmentManager().beginTransaction(); 
fragmentTransaction.replace(R.id.container_body, fragment); 
fragmentTransaction.commit(); 

Вы также можете ознакомиться с sample code, представленными в репозитории. Fragment в этом примере настроен по-разному, представление создается внутри класса, а не в XML. Но это может помочь вам использовать любые другие функции, предусмотренные в ZXingScannerView, а также изменить настройки макета.

Смежные вопросы