2016-10-10 3 views
0

Это мой код для сканирования штрих-кодов и установить содержание TextView:TextView не SetText на onActivityResult Фрагмент

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.

+0

Где вы назвали 'startActivityForResult()'? –

+0

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

+0

https://developer.android.com/training/basics/intents/result.html –

ответ

0

Попробуйте изменить эту строку 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 внутри вашего фрагмента для результата.

0

я не знаю, что ваш 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); 
    } 
} 
0

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

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

Что означает SCAN_INTENT_CODE? –

+0

@NaufalPrakoso SCAN_INTENT_CODE - переменная Integer от 0 до 255, вы должны определить и убедиться, что она не превышает 256. – vidulaJ

0

OnActivityResult() вызывается только, если вы звоните startActivityForResult()

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

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

Смежные вопросы