[英]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.