【问题标题】:Android - Changing the contentview of the activity of Navigation drawerAndroid - 更改导航抽屉活动的内容视图
【发布时间】:2016-08-04 20:06:25
【问题描述】:

我正在使用导航抽屉创建一个简单的 QR 扫描应用程序来抛出不同的片段,对于 QR 扫描部分,我使用的是 ZXing Scanner 库。

在其中一个片段中,有一个叫做“扫描”的按钮,当点击下面的代码运行时

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" />

【问题讨论】:

  • 我可能会避免多次调用setContentView(),因为这将重绘整个视图。为什么不在单独的片段中调用相机,或者如果您再次绘制整个屏幕,为什么不开始一个新的活动(为了结果)?无论如何,就实际问题而言,显示一些代码。您的 XML 文件中有什么内容,它试图扩展的片段类是什么样的?
  • 当然你会得到 setContentView() 错误,你不能这样做,你要么开始一个新的活动,要么像@Bryan说的那样片段
  • @Bryan,我添加了代码,我正在尝试找到一种方法,让我可以同时使用 QR 扫描仪的库和导航抽屉,这就是为什么我不将相机称为我需要这样做扔图书馆。

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


【解决方案1】:

快速查看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;
}

然后,您可以将片段替换为ScannerFragment,而不是在您的Activity 中再次调用setContentView,就像您使用其他片段一样:

Fragment fragment = ScannerFragment.newInstance();

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

您可能还想查看存储库中提供的sample code。此示例中的 Fragment 设置不同,视图是在类中创建的,而不是在 XML 中。但它可以帮助您利用 ZXingScannerView 提供的任何其他功能,以及处理布局更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多