2016-08-04 13 views
0

ナビゲーション・ドロワーを使用して単純なQRスキャン・アプリケーションを作成し、異なるフラグメントをスローすると、QRスキャニング・パーツでZXingスキャナー・ライブラリーを使用しています。私はカメラを閉じるには、次のコードを記述する必要がありhandleResult方法では、今、次のコードの実行Android - ナビゲーションドロワーのアクティビティのコンテンツビューを変更する

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

をクリックすると断片の一つで

は、「スキャン」というボタンがあります。私はこのコードを実行すると

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

任意のアイデアを得ますか?

コード:

主な活動:XML用として

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(); 
} 

}

<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

で簡単に見210は、ZXingScannerViewViewクラスの子孫であることを示している。あなたのActivityで再び代わりにsetContentViewを呼び出すのでは、その後

@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; 
} 

<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を作成することができますので、あなたは、このようなレイアウトを作成することができるはずです、あなたはあなたの他の断片であるのと同様に、ScannerFragmentとフラグメントを置き換えることができます。

Fragment fragment = ScannerFragment.newInstance(); 

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

また、リポジトリに用意されているsample codeをご覧ください。このサンプルのFragmentは別の方法で設定されています。ビューはXMLではなくクラス内で作成されます。しかし、ZXingScannerViewによって提供される他の機能を利用したり、レイアウトの変更を処理したりするのに役立ちます。

関連する問題