Android Perform Click Perform Touch

  بِسْــــــــــــــــــمِ اللهِ الرَّحْمَنِ الرَّحِيْمِ

 

Tips kali ini barangkali ada yang hendak simulasi klik pada button atau view semisalnya secara progmatically, yang demikian bisa memakai performClick ( mButton.performClick() ) hanya saja dari pengalaman, jika mButton memiliki function maka menggunakan performClick akan men trigger function tersebut meskipun mButton telah di disable. Dan menggunakan touch ini lah bisa simulasi klik pada button atau view semisal, tanpa menjalankan function nya karena view / button tersebut di disable.

 

Simple case nya, jika ada view parent (LinearLayout) dan view child (TextView) untuk membuat semisal 1 custom button yang masing-masing view memiliki aksi, LinearLayout untuk function suara / getar dan TextView untuk function API request, jadi ketika tombol di klik otomatis bersuara dan request API, dengan ini kita bisa memakai android:addStatesFromChildren="true" di view parent nya sehingga jika view parent di klik function child juga ke trigger, atau memakai android:duplicateParentState="true" di view child yang mana akan menduplikasi klik parent (pastikan tidak memasang dua duanya di parent dan child karena bisa terus looping). Akan tetapi jika ada opsi view child (TextView) di disable otomatis function request API nya tetap ke trigger jika menggunakan cara-cara diatas. Solusinya masukkan view parent pada OnClickListener dan didalamnya trigger view child dengan touch, seperti ini :

private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
b.apply {
btn1.setOnClickListener(listenerVoice)
tv1.setOnClickListener { requestAPI() }
if(!permission){
tv1.isEnabled = false
}
}
}
fun performTouch(v: View) {
val TAG = "onTouch"
var originalDownTime: Long = SystemClock.uptimeMillis()
var eventTime: Long = SystemClock.uptimeMillis() + 100
var x = 0.0f
var y = 0.0f
var metaState = 0
var motionEvent = MotionEvent.obtain(
originalDownTime,
eventTime,
MotionEvent.ACTION_DOWN,
x,
y,
metaState
)
var returnVal = v.dispatchTouchEvent(motionEvent)
Log.d(TAG, "rteurnVal: " + returnVal)
//Create amd send the ACTION_UP MotionEvent
eventTime = SystemClock.uptimeMillis() + 100
motionEvent = MotionEvent.obtain(
originalDownTime,
eventTime,
MotionEvent.ACTION_UP,
x,
y,
metaState
)
returnVal = v.dispatchTouchEvent(motionEvent)
Log.d(TAG, "rteurnVal: " + returnVal)
}
val listenerVoice = View.OnClickListener { view ->
//perform your global function here like custom sound each button or etc
//and you can assign value to most of views with tag, especially if it's layout
//example : SimpleAudioPlayer().playAudio(c, findViewById<LinearLayout>(view.id).tag.toString())
//source for SimpleAudioPlayer() = https://gist.github.com/CreatorB/08da5488ebcd8d1d916c7b9f0d4926a3
when (view.getId()) {
R.id.btn1 -> {
//this the trick, performTouch only trigger function requestAPI() if it view enabled
performTouch(b.tv1)
}
}
}
view raw MainActivity.kt hosted with ❤ by GitHub


Demikian semoga yang singkat, padat akan manfaat, terlebih semoga Allah memberi kita tawfik.


اَللّٰهُ أَعْلَم‎

Share this:

Tidak ada komentar