2016-08-04 119 views
0

我创建了一个简单的QR扫描应用程序,使用导航抽屉去扔不同的碎片,QR扫描部分我正在使用ZXing扫描仪库。Android - 更改导航抽屉活动的内容视图

在片段中的一个,有一个被称为“扫描”按钮,当在handleResult方法我应该写入以下代码以关闭照相机点击下面的代码运行

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

任何想法如何解决这个问题?

代码:

主要活动:

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显示ZXingScannerViewView类的后代。因此,你应该能够创建这样一个布局:在您的Activity

@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

<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提供的任何其他功能,以及处理布局更改。