我正在创建一个简单的QR扫描应用程序,使用导航抽屉投掷不同的碎片,对于我正在使用ZXing扫描仪库的QR扫描部分。
在其中一个片段中,有一个名为“scan”的按钮,单击时会运行以下代码
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" />
答案 0 :(得分: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
提供的任何其他功能,以及处理布局更改。