मैं वर्तमान में एक स्कैनर ऐप विकसित कर रहा हूं जो ज़ेबरा एसडीके का उपयोग करता है।
मुझे मिले नमूने और दस्तावेज में, एक ऑन टच लिस्टनर एक नया इरादा (स्कैन) बनाता है और इसे प्रसारित करता है। ओवरराइड ऑन न्यूइन्टेंट विधि में, इरादा डीकोड हो जाता है और स्कैन किए गए मान वापस कर दिए जाते हैं।

यह सब तब तक बढ़िया काम करता है जब तक मैं 1 गतिविधि का उपयोग करता हूं और कोई टुकड़े नहीं करता, लेकिन मैं जिस ऐप को बना रहा हूं उसके लिए मैं 1 गतिविधि और एकाधिक टुकड़े करना चाहता हूं। फिलहाल सब कुछ 1 गतिविधि (और एक दृश्य) में होता है, लेकिन यह थोड़ा अव्यवस्थित हो रहा है और चीजों को करने का आदर्श तरीका नहीं है, इसलिए मैं अंततः गतिविधि को विभाजित कर दूंगा।

मैंने टुकड़े बनाने की कोशिश की और तिजोरियों का उपयोग करके उनके बीच डेटा पास किया। लेकिन मैं यह नहीं समझ सका कि कैसे इरादा शुरू किया जाए और परिणाम को टुकड़ों के भीतर से कैप्चर किया जाए। मैंने अपने टुकड़े में एक ऑन टच लिस्टनर जोड़ने की कोशिश की, जो:

नीचे गतिविधि में वर्तमान कोड है। मेरे पास कोई अंश नहीं है क्योंकि अब तक मेरे सभी प्रयास विफल रहे हैं।

 override fun onTouch(view: View?, motionEvent: MotionEvent?): Boolean {
        if (view?.getId() == R.id.btnScanner) {
            if (motionEvent?.getAction() == MotionEvent.ACTION_DOWN) {
                //  Button pressed, start scan
                val dwIntent = Intent()
                dwIntent.action = "com.symbol.datawedge.api.ACTION"
                dwIntent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "START_SCANNING")
                dwIntent.putExtra("Type", "START")
                sendBroadcast(dwIntent)
            } else if (motionEvent?.getAction() == MotionEvent.ACTION_UP) {
                //  Button released, end scan
                val dwIntent = Intent()
                dwIntent.action = "com.symbol.datawedge.api.ACTION"
                dwIntent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "STOP_SCANNING")
                dwIntent.putExtra("Type", "END")
                sendBroadcast(dwIntent)
            }
        }
        return true
    }

 override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        if (intent.getStringExtra("Type") != "START") {
           //This would be for the first fragment
            if (personId.text.toString().isEmpty()) {
                val id = decodeScan((intent))
                personId.text = id
                lockId()
            } else {
              //This would be in the second fragment, after the user signed in by scanning his personal barcode
                if (productId.hasFocus() || productId.text.isEmpty()) {
                    val res = decodeScan(intent)
                    productId.text = res
                } else if (locationId.hasFocus() || (locationId.text.isEmpty() && productId.text.isNotEmpty())) {
                    val res = decodeScan(intent)
                    val location = (locations.filter { x -> x.contains(res) }).first()
                    locationId.setText(location)
                }
            }
        }
    }
0
Cevdam 22 जिंदा 2021, 14:08

2 जवाब

सबसे बढ़िया उत्तर

onNewIntent केवल गतिविधि में उपलब्ध है, इसलिए आपको अंशों को आशय उपलब्ध कराने की आवश्यकता है।

ऐसा करने के लिए, आप MutableLiveData और ViewModel का उपयोग कर सकते हैं।

class MyViewModel: ViewModel() {
    val intent = MutableLiveData<Intent?>() 
}

फिर

class MyActivity: AppCompatActivity() {
    private val  myViewModel by viewModels<MyViewModel>() 
    
    override fun onCreate( savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.my_activity)
        val myViewModel = myViewModel
        myViewModel.intent = intent
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        myViewModel.intent = intent
    } 
}

और

class MyFragment: Fragment() {
    private val MyViewModel by activityViewModels<MyViewModel>() 

    ... 
}

और आप जीवनचक्र के स्वामी के लिए this का उपयोग करके onCreate में वर्तमान आशय देख सकते हैं।

1
EpicPandaForce 22 जिंदा 2021, 15:44

विधि onNewIntent गतिविधि से संबंधित है, इसलिए आप इसे अपने टुकड़े में उपयोग नहीं कर सकते। आप क्या कर सकते हैं, डेटा को अपने टुकड़े पर पास करें जब यह न्यूइन्टेंट पर कॉल करता है, तो आपके पास खंड का संदर्भ होता है।

var fragment; //assign default value to fragment

override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// you can add fragment based checks in this method                                       
   to work as you want
 if (fragment is YourFragment) {

    if (intent.getStringExtra("Type") != "START") {
       //This would be for the first fragment
        if (personId.text.toString().isEmpty()) {
            val id = decodeScan((intent))
            personId.text = id
            lockId()
        }
     }
    }else if (fragment is YourSecondFragment) {{
            if (productId.hasFocus() || productId.text.isEmpty()) {
                val res = decodeScan(intent)
                productId.text = res
            } else if (locationId.hasFocus() || (locationId.text.isEmpty() && 
               productId.text.isNotEmpty())) {
                val res = decodeScan(intent)
                val location = (locations.filter { x -> x.contains(res) }).first()
                locationId.setText(location)
            }
        }
    }
}
0
Priyanka Rajput 22 जिंदा 2021, 15:21