Fragment activity catch onKeyDown and use in fragment

后端 未结 6 644
别那么骄傲
别那么骄傲 2020-12-09 08:28

I have Fragment activity with pager:

List fragments = new Vector();
    fragments.add(Fragment.instantiate(this, PastEventLis         


        
6条回答
  •  失恋的感觉
    2020-12-09 09:04

    As mentioned by others, the accepted answer results in tight coupling between the activity and its fragments.

    I would suggest using some sort of event-based implementation instead. This is much more reusable and results in a better software architecture. In previous projects I have used one of the following solutions (Kotlin):

    Broadcasts

    Using Android´s LocalBroadcastManager: Documentation

    Create a BroadcastReceiver:

    class SomeBroadcastReceiver : BroadcastReceiver() {
    
        override fun onReceive(context: Context?, intent: Intent?) {
            val keyCode = intent?.getIntExtra("KEY_CODE", 0)
            // Do something with the event
        }
    

    }

    In your activity:

    class SomeActivity : AppCompatActivity() {
    
        override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
            val intent = Intent("SOME_TAG").apply { putExtra("KEY_CODE", keyCode) }
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
            return super.onKeyDown(keyCode, event)
        }
    
    }
    

    Then, in any of the fragments (or services, etc..):

    class SomeFragment : Fragment() {
    
        val receiver = SomeBroadcastReceiver()
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    
            val filter = IntentFilter().apply { addAction("SOME_TAG") }
            LocalBroadcastManager.getInstance(context!!).registerReceiver(receiver, filter)
    
            return super.onCreateView(inflater, container, savedInstanceState)
        }
    
    }
    

    EventBus

    Using EventBus

    Create an event class:

    data class Event(val keyCode: Int)
    

    In your activity:

    class SomeActivity : AppCompatActivity() {
    
        override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
            EventBus.getDefault().post(Event(keyCode))
            return super.onKeyDown(keyCode, event)
        }
    
    }
    

    Then, in your fragment:

    class SomeFragment : Fragment() {
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    
            // Register for events
            EventBus.getDefault().register(this)
    
            return super.onCreateView(inflater, container, savedInstanceState)
        }
    
        @Subscribe
        public fun onKeyEvent(event : Event) {
            // Called by eventBus when an event occurs
        }
    
        override fun onDestroyView() {
            super.onDestroyView()
            EventBus.getDefault().unregister(this)
        }
    
    }
    

提交回复
热议问题