Android - 更改导航抽屉

时间:2016-08-04 20:06:26

标签: android android-fragments navigation-drawer qr-code zxing

我正在创建一个简单的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" />

1 个答案:

答案 0 :(得分:0)

快速查看source表明ZXingScannerViewView类的后代。因此,您应该能够创建如下布局:

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

相关问题