【问题标题】:TextView not displaying ResultTextView 不显示结果
【发布时间】:2017-01-07 12:54:40
【问题描述】:

我正在做这个应用程序,它扫描条形码并显示结果。目前TexView在扫描条形码后没有显示任何内容,你们能帮帮我吗?

这是MainActivity.java

public class MainActivity extends AppCompatActivity {
    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scrollable_tabs);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new OneFragment(), "ONE");
        adapter.addFrag(new TwoFragment(), "TWO");
        adapter.addFrag(new ThreeFragment(), "THREE");
        adapter.addFrag(new FourFragment(), "FOUR");
        adapter.addFrag(new FiveFragment(), "FIVE");
        adapter.addFrag(new SixFragment(), "SIX");
        adapter.addFrag(new SevenFragment(), "SEVEN");
        adapter.addFrag(new EightFragment(), "EIGHT");
        adapter.addFrag(new NineFragment(), "NINE");
        adapter.addFrag(new TenFragment(), "TEN");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
}

这是扫描仪代码

public class OneFragment extends Fragment{
    public OneFragment() {
        // Required empty public constructor
    }

    Button scan_btn;
    TextView barcode;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle   savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_one, container, false);
        scan_btn = (Button) view.findViewById(R.id.scan_button);
        //initialize the textViews
        barcode = (TextView)view.findViewById(R.id.barcodeResult);
        final Activity activity = getActivity();
        scan_btn.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                IntentIntegrator integrator = new IntentIntegrator(activity);
                integrator.setDesiredBarcodeFormats(IntentIntegrator.PRODUCT_CODE_TYPES);
                integrator.setPrompt("Scan");
                integrator.setCameraId(0);
                integrator.setBeepEnabled(false);
                integrator.setBarcodeImageEnabled(true);
                integrator.initiateScan();
            }
        });

        return view;
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (result != null) {
            barcode.setText(result.getContents());
        }else {
            Toast toast = Toast.makeText(getContext(),"No scan data received!", Toast.LENGTH_SHORT);
            toast.show();
        }
    }
}

还有xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <Button android:id="@+id/scan_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="scan" />

    <TextView
        android:id="@+id/barcodeResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Start scanning by pressing the FAB!"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

【问题讨论】:

  • textView 显示什么,是不是报错了?
  • 也许活动结果应该在活动而不是片段上?
  • Activity 或 Fragment 毫无意义,该功能必须与两者一起使用
  • 没有错误,我认为只是给出一个空值
  • 没有错误,我认为只是给出一个空值

标签: android barcode zxing barcode-scanner


【解决方案1】:

当从另一个活动返回时,系统可能会尝试恢复视图状态,实际上会覆盖您刚刚编写的内容。

将结果保存到成员中并尝试在片段中覆盖 onViewStateRestored

    @Override
    public void onViewStateRestored(Bundle savedInstanceState){
     super.onViewStateRestored(savedInstanceState);
     if( barcode != null ){
         barcode.setText(mResult);
     }
    }

【讨论】:

  • 把它放在我的片段代码中?抱歉,您能否提供一个样本,因为我对这些学习很陌生
  • 如果您的 onActivityResult 没有被调用,那么这是您必须查看的第一个问题。我的代码只是阻止片段视图(您的文本视图)重置为以前的值,但如果不调用 onActivityResult 我的代码不会做任何特别的事情。
【解决方案2】:

确保您的Activity 中的OnActivityResult 正在调用super.OnActivityResult()。这应该确保它也被 Fragment 调用。

或者..

试试这个包装类:而不是IntentIntegrator

import android.content.Intent;
import android.support.v4.app.Fragment;

import com.google.zxing.integration.android.IntentIntegrator;

public final class FragmentIntentIntegrator extends IntentIntegrator {

    private final Fragment fragment;

    public FragmentIntentIntegrator(Fragment fragment) {
        super(fragment.getActivity());
        this.fragment = fragment;
    }

    @Override
    protected void startActivityForResult(Intent intent, int code) {
        fragment.startActivityForResult(intent, code);
    }
}

它确保fragment onactivityresult 被调用..

在你的 OneFragment 中调用它;

FragmentIntentIntegrator integrator = new FragmentIntentIntegrator (this);

或者...

看到这个http://androide-examples.blogspot.com/2013/11/zxing-onactivityresult-called-only-in.html

它显示了详细的实现

【讨论】:

  • 对于 super.onactivityresult 你如何把它放在代码中。抱歉,我是 java 和 android 新手
【解决方案3】:

抱歉来晚了,因为我编译你的项目有很多错误,你也更容易在 Github 上上传它

无论如何,您使用扫描仪的方式根本没有进入onActivityResult() 方法,所以我将其重新创建为MainActivity class of the sample library 当然也可以为您定制

这是你的代码,我已经测试过了,它确实有效,你只需要复制并粘贴它

package info.androidhive.materialtabs.fragments;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

import info.androidhive.materialtabs.R;


public class OneFragment extends Fragment{
public OneFragment() {
    // Required empty public constructor
}

private String toast;
Button scan_btn;
TextView barcode;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_one, container, false);
    scan_btn = (Button) view.findViewById(R.id.scan_button);
    barcode = (TextView)view.findViewById(R.id.barcodeResult);
    scan_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            scanFromFragment();
        }
    });
    return view;
}

public void scanFromFragment() {
    IntentIntegrator.forSupportFragment(this)
            .setDesiredBarcodeFormats(IntentIntegrator.PRODUCT_CODE_TYPES)
            .setPrompt("Scan")
            .setCameraId(0)
            .setBeepEnabled(false)
            .setBarcodeImageEnabled(true)
            .initiateScan();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if(result != null) {
        if(result.getContents() == null) {
            toast = "Cancelled from fragment";
        } else {
            barcode.setText(result.getContents());
            toast = "Scanned from fragment: " + result.getContents();
        }

        // At this point we may or may not have a reference to the activity
        displayToast();
    }
}

private void displayToast() {
    if(getActivity() != null && toast != null) {
        Toast.makeText(getActivity(), toast, Toast.LENGTH_LONG).show();
        toast = null;
    }
}
}

还可以在fragment_one 布局中添加barcodeResult android:layout_below="@+id/scan_button",因为它就在扫描按钮的后面

【讨论】:

  • @Jason 欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请参阅About 页面和How do I ask questions here?
猜你喜欢
  • 1970-01-01
  • 2012-11-03
  • 2016-12-02
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多