2017-01-07 33 views
1

私はバーコードをスキャンして結果を表示するこのアプリケーションを行っています。現在、TexViewはバーコードをスキャンした後に何も表示されません。TextViewが表示されない結果

ここ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> 
+0

textViewの表示は何ですか?エラーになりますか? –

+0

多分、活動結果が断片ではなく活動にあ​​るべきであろうか? –

+0

アクティビティまたはフラグメントは何も意味を持たない関数は両方ともで動作する必要があります –

答えて

0

はあなたのActivityOnActivityResultsuper.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); 
    } 
} 

のそれはfragmentonactivityresultが呼び出されることを保証します。..

のようなあなたのOneFragmentでそれを呼び出します。

FragmentIntentIntegrator integrator = new FragmentIntentIntegrator (this); 

か...

見るこのhttp://androide-examples.blogspot.com/2013/11/zxing-onactivityresult-called-only-in.html

それは別の活動から戻ってくると、システムが実際に上書きし、ビューステートを復元しようとする可能性があり、詳細な実装

+0

ok私はラッパーを試しましたが、それは仕事をしませんでした – Jason

+0

super.onactivityresultどのようにコードに入れますか?申し訳ありません私はJavaとAndroidに新しい – Jason

+0

@ジェイソンは編集を参照してください.. – rafsanahmad007

0

を表示するものあなたはただ書きました。

も、あなたがアップロードするのは簡単です、メンバーにあなたの結果を保存し、遅刻FO申し訳

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

は私のフラグメントコードに入れましたか?申し訳ありませんが、私はこれらの学習に新しいサンプルを提供することができますか? – Jason

+0

あなたのonActivityResultが呼び出されていない場合、それはあなたが見なければならない最初の問題です。私のコードでは、フラグメントビュー(テキストビュー)を以前の値にリセットすることはできませんが、onActivityResultが呼び出されない場合、私のコードは特別な処理を行いません。 – DrKappa

0

あなたのフラグメントにonViewStateRestoredが、それは私がプロジェクトのコンパイルになったので、そんなにエラーだオーバーライドしてみてくださいそれ

確かにカスタマイズあなたはスキャナーを使用している方法が全く onActivityResult()方法を入力されていません。とにかくGithubの

、私は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; 
    } 
} 
} 

また、あなたのbarcodeResultfragment_oneでレイアウトandroid:layout_below="@+id/scan_button"に追加コピーして貼り付ける必要があり、働く

+0

@ Jasonようこそスタックオーバーフロー。 ここで「感謝」と言われるのが好ましい方法は、 上向きの良い質問と役立つ回答(十分な回答を得たら )と、 質問に最も役立つ回答を受け入れることです(これにより、評判が少し向上します)。 [情報]ページと[質問はどうすればいいですか? はこちらですか?](http://stackoverflow.com/help/how-to-ask) –

関連する問題