簡體   English   中英

在onActivityResult片段上TextView不能setText

[英]TextView not setText on onActivityResult Fragment

這是我的代碼,用於掃描條形碼並將內容設置為TextView

public class scanCodeFragment extends android.support.v4.app.Fragment implements View.OnClickListener{

  Button btnScan;
  TextView contentTxt;
  String substrCode, scanContent;
  View v;

  public scanCodeFragment(){
  }

  @Override
  public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    v = inflater.inflate(R.layout.fragment_scan_code, container, false);
    btnScan = (Button) v.findViewById(R.id.btnScan);
    contentTxt = (TextView) v.findViewById(R.id.scan_content);

    btnScan.setOnClickListener(this);

    return v;
  }

  public void onClick(View v){
    if (v.getId() == R.id.btnScan){
        IntentIntegrator scanIntegrator = new IntentIntegrator(getActivity());
        scanIntegrator.initiateScan();
    }
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
    if (scanningResult != null) {
        scanContent = scanningResult.getContents();
        substrCode = scanContent.substring(2, 10);
        contentTxt.setText("NIS: " + substrCode);
    }
    else {
        Toast toast = Toast.makeText(getActivity(), "Kode barcode salah", Toast.LENGTH_SHORT);
        toast.show();
    }
  }
}

onActivityResult方法中,掃描條形碼后無法獲得結果。 在此代碼片段之前,我可以從onActivityResult獲取結果。

我不知道您的initialScan()是什么,所以如果需要可以保留它

final int requestCode = 100;

public void onClick(View v){
    if (v.getId() == R.id.btnScan){
      IntentIntegrator intent = new IntentIntegrator(getContext(), MainActivity.class);
            intent.putExtra(RECIPE_EXTRA, extraObject);
            startActivityForResult(intent, requestCode);
    }
}

根據您提供的代碼片段,建議您創建一個單獨的Activity進行掃描,而不是Class文件(對於IntentIntegrator而言是Class文件),並在單擊“掃描” Button時啟動它。

因此,創建IntentIntegratorActivity並像這樣啟動它。

public void onClick(View v){
    if (v.getId() == R.id.btnScan){
        IntentIntegratorActivity intent = new Intent(getActivity(), IntentIntegratorActivity.class);
        startActivityForResult(intent, SCAN_INTENT_CODE);//Remember this code, which is an Integer value
    }
}

然后,在IntentIntegratorActivity OnCreate方法中,執行掃描並通過Intent返回掃描數據。

Intent returnIntent = new Intent();
returnIntent.putExtra("SCAN_DATA_KEY", scanData);//Send scan data from here and remember the key SCAN_DATA_KEY
setResult(RESULT_OK, returnIntent);
finish();

然后,應該在Fragment Class onActivityResult方法中捕獲此數據。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case ConstList.SCAN_INTENT_CODE:
        String scanData = data.getStringExtra("SCAN_DATA_KEY");//Use this key to get the data. 
        //I have assumed that the data is String
        contentTxt.setText("NIS: " + scanData);//Set data to the Text field
        break;     
    }
}

嘗試更改此行IntentIntegrator scanIntegrator = new IntentIntegrator(getActivity()); 到此IntentIntegrator scanIntegrator = new IntentIntegrator(this);

原因是,如果你傳遞一個活動的參數中IntentIntegrator然后initiateScan將被稱為activity.startActivityForResult(intent, code) -這樣的結果將不會被傳遞到片段(嘗試檢查onActivityResult父活動,它會被稱為)。 但是,如果您將Fragment作為IntentIntegrator內部的參數傳遞-將被稱為fragment.startActivityForResult(intent, code) ,因此Android框架將能夠在片段內部調用onActivityResult作為結果。

僅當您調用startActivityForResult()時才調用OnActivityResult()

我在Fragment中調用startActivityForResult()並在Fragment中實現onActivityResult,onActivityResult()將被正確調用。

您不能在活動中調用startActivityForResult(),否則Fragment中的onActivityResult()不會被調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM