https://kotlinlang.org logo
#compose
Title
# compose
m

Mehmet Peker

09/10/2020, 10:11 AM
hello everyone i finally add compose an existing project but i have a question.How can i do activity.onBackpressed on navigation icon click without use navigation library?
t

Timo Drick

09/10/2020, 10:17 AM
So i think the correct way would be to add a callback to your composable. And handle this callback at the point where you do setContent {} in your activty so you have access to the activity.
m

Mehmet Peker

09/10/2020, 10:39 AM
Thank you for your solution 😄 I was created fragment instance in companion object and call function but this way seems better
t

Timo Drick

09/10/2020, 10:45 AM
There is also another way to get the activity but maybe not what you should do:
Copy code
val activity = ContextAmbient.current as Activity
So for navigation i would prefere the callback. But there are other use cases where you need an activity to use an system api and do not want to integrate it into your main activity
m

Mehmet Peker

09/10/2020, 11:01 AM
Okey i know but how to initialize composable function before setcontent{}
Copy code
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val binding = FragmentMessageBinding.inflate(LayoutInflater.from(requireContext()), container, false)
    (binding.root as ViewGroup).setContent(Recomposer.current()) {
        MessageScreen(this)
    }
    return binding.root
}

override fun onNavigationClick() {
    requireActivity().onBackPressed()
}
Sorry i must after setContent but how?
t

Timo Drick

09/10/2020, 11:05 AM
You should change your MessageScreen to have a callback ->
MessageScreen(onNavigaionClick: () -> Unit)
Than you can write in the setContent part:
MessageScreen() { onNavigationClick() }
I don't think it is a good idea to pass the fragment directly to the composables.
m

Mehmet Peker

09/10/2020, 11:11 AM
Not working for me.App crashing after click
t

Timo Drick

09/10/2020, 11:11 AM
Can you please post the error back stack
m

Mehmet Peker

09/10/2020, 11:18 AM
A part of error 2020-09-10 141743.752 9866-9866/com.zikirmatik.digitaltasbeeh E/InputEventReceiver: Exception dispatching input event. 2020-09-10 141743.753 9866-9866/com.zikirmatik.digitaltasbeeh E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback 2020-09-10 141743.755 9866-9866/com.zikirmatik.digitaltasbeeh E/MessageQueue-JNI: java.lang.IllegalStateException: Internal state has not been set. This method should not be called in any place but after calls to onPointerInputSetup and before calls to onPointerInputTearDown or onCancel. Also, onCustomEvent must be called appropriately. See docs for details.
t

Timo Drick

09/10/2020, 11:19 AM
Sorry too less information to really help you. Maybe you could post the code of the MessageScreen?
Or just make a simplified version with just one button and try if it is working.
m

Mehmet Peker

09/10/2020, 11:22 AM
2020-09-10 142111.400 10009-10126/com.zikirmatik.digitaltasbeeh E/eglCodecCommon: GoldfishAddressSpaceHostMemoryAllocator: ioctl_ping failed for device_type=5, ret=-1 2020-09-10 142131.526 10009-10009/com.zikirmatik.digitaltasbeeh E/InputEventReceiver: Exception dispatching input event. 2020-09-10 142131.527 10009-10009/com.zikirmatik.digitaltasbeeh E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback 2020-09-10 142131.531 10009-10009/com.zikirmatik.digitaltasbeeh E/MessageQueue-JNI: java.lang.IllegalStateException: Internal state has not been set. This method should not be called in any place but after calls to onPointerInputSetup and before calls to onPointerInputTearDown or onCancel. Also, onCustomEvent must be called appropriately. See docs for details. at androidx.compose.ui.gesture.scrollorientationlocking.ScrollOrientationLocker.getPointersFor(ScrollOrientationLocker.kt:192) at androidx.compose.ui.gesture.DragSlopExceededGestureFilter.onPointerInput-e3WT7_U(DragSlopExceededGestureFilter.kt:122) at androidx.compose.ui.input.pointer.PointerInputFilter.onPointerEvent-d1fqKvQ(PointerEvent.kt:64) at androidx.compose.ui.input.pointer.Node.dispatchToPointerInputFilter(HitPathTracker.kt:530) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:430) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.NodeParent.dispatchChanges(HitPathTracker.kt:282) at androidx.compose.ui.input.pointer.HitPathTracker.dispatchChanges(HitPathTracker.kt:131) at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-EhkylT0(PointerInputEventProcessor.kt:71) at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.kt:578) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830) at android.app.Activity.dispatchTouchEvent(Activity.java:3400) at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398) at android.view.View.dispatchPointerEvent(View.java:12752) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5106) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4909) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453) at android.view.ViewRootImpl$AsyncInputStage.apply(Vie 2020-09-10 142131.537 10009-10009/com.zikirmatik.digitaltasbeeh E/AndroidRuntime: FATAL EXCEPTION: main Process: com.zikirmatik.digitaltasbeeh, PID: 10009 java.lang.IllegalStateException: Internal state has not been set. This method should not be called in any place but after calls to onPointerInputSetup and before calls to onPointerInputTearDown or onCancel. Also, onCustomEvent must be called appropriately. See docs for details. at androidx.compose.ui.gesture.scrollorientationlocking.ScrollOrientationLocker.getPointersFor(ScrollOrientationLocker.kt:192) at androidx.compose.ui.gesture.DragSlopExceededGestureFilter.onPointerInput-e3WT7_U(DragSlopExceededGestureFilter.kt:122) at androidx.compose.ui.input.pointer.PointerInputFilter.onPointerEvent-d1fqKvQ(PointerEvent.kt:64) at androidx.compose.ui.input.pointer.Node.dispatchToPointerInputFilter(HitPathTracker.kt:530) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:430) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.Node.dispatchChanges(HitPathTracker.kt:426) at androidx.compose.ui.input.pointer.NodeParent.dispatchChanges(HitPathTracker.kt:282) at androidx.compose.ui.input.pointer.HitPathTracker.dispatchChanges(HitPathTracker.kt:131) at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-EhkylT0(PointerInputEventProcessor.kt:71) at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.kt:578) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830) at android.app.Activity.dispatchTouchEvent(Activity.java:3400) at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398) at android.view.View.dispatchPointerEvent(View.java:12752) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5106) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4909) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585) 2020-09-10 142131.538 10009-10009/com.zikirmatik.digitaltasbeeh E/AndroidRuntime: at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4642) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7092) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7061) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7022) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7195) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:186) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:326) at android.os.Looper.loop(Looper.java:160) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
t

Timo Drick

09/10/2020, 11:23 AM
Sorry did not have this problem yet. Maybe it is a bug of this mixing legacy and compose views?
I think this is still under heavy development.
m

Mehmet Peker

09/10/2020, 11:30 AM
Thank you for everythink i will fork about this
*work
t

Timo Drick

09/10/2020, 11:31 AM
Can you try:
Copy code
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
return ComposeView(requireContext()).apply {
            setContent {
                MessageView ...
            }
        }
m

Mehmet Peker

09/10/2020, 11:41 AM
Not working 😞
12 Views