Android - 更改导航抽屉活动的内容视图
问题描述:
我创建了一个简单的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" />
答
就让我们来看看在source显示ZXingScannerView
是View
类的后代。因此,你应该能够创建这样一个布局:在您的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
提供的任何其他功能,以及处理布局更改。
我可能会避免多次调用'setContentView()',因为这将重绘整个视图。为什么不用一个单独的片段调用摄像机,或者如果您再次绘制整个画面,为什么不只是开始一个新的活动(为了结果)呢?无论如何,就实际问题而言,显示一些代码。什么是你的XML文件,以及片段类是什么样的,它试图膨胀? – Bryan
当然你会得到setContentView()的错误,你不能这样做,你要么开始一个新的活动,要么@Bryan说片段 – has19
@Bryan,我添加了代码,我试图找到一种方法这将允许我使用QR扫描仪库和导航抽屉,这就是为什么我没有调用相机,因为我需要这样做来丢弃图书馆。 –