TextView не задает текст для фрагмента onActivityResult

#java #android #fragment

#java #Android #фрагмент

Вопрос:

Это мой код для сканирования штрих-кода и установки содержимого в 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.

Комментарии:

1. Куда вы звонили startActivityForResult() ?

2. Я не вызываю startActivityForResult(). Где я должен вызвать startActivityForResult()?

3. подробнее developer.android.com/training/basics/intents/result.html

4. Возможно, onActivityResult на вашем фрагменте не вызывается и не вызывается его родительская активность onActivityResult .

Ответ №1:

Попробуйте изменить эту строку IntentIntegrator scanIntegrator = new IntentIntegrator(getActivity()); на эту IntentIntegrator scanIntegrator = new IntentIntegrator(this); .

Причина в том, что если вы передадите Activity в качестве параметра внутри IntentIntegrator, тогда initiateScan будет вызван activity.startActivityForResult(intent, code) on — поэтому результат не будет передан фрагменту (попробуйте проверить onActivityResult для родительской активности, он будет вызван). Но если вы передадите фрагмент в качестве параметра внутри IntentIntegrator — будет вызван fragment.startActivityForResult(intent, code) , поэтому платформа Android сможет вызывать onActivityResult внутри вашего фрагмента для получения результата.

Ответ №2:

я не знаю, что такое ваш initiateScan (), поэтому сохраните его, если вам это нужно

 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);
    }
}
  

Ответ №3:

Из предоставленного вами фрагмента кода я предлагаю вам создать отдельный Activity для сканирования, а Class не файл, в вашем случае, который есть IntentIntegrator , и запустить его при 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
    }
}
  

Затем, в OnCreate методе IntentIntegratorActivity , выполните сканирование и верните данные сканирования через 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();
  

Затем эти данные должны быть перехвачены внутри onActivityResult метода в Fragment Class .

 @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;     
    }
}
  

Комментарии:

1. Что означает SCAN_INTENT_CODE?

2. @NaufalPrakoso SCAN_INTENT_CODE — это целочисленная переменная в диапазоне от 0 до 255, вы должны определить и убедиться, что она не превышает 256.

Ответ №4:

onActivityResult() вызывается только в том случае, если вы вызываете startActivityForResult()

Я вызываю startActivityForResult() во фрагменте и реализую onActivityResult во фрагменте, onActivityResult() будет вызываться правильно.

вы не можете вызвать startActivityForResult() в activity, иначе onActivityResult() во фрагменте вызываться не будет