Inconvertible types; cannot cast androidx.fragment.app.Fragment to com.google.ar.sceneform.ux.ArFragment

790 Views Asked by At

I am developing an AR measuring app but I have an error on arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.fragment);. The error shows inconvertible types; cannot cast 'androidx.fragment.app.Fragment' to 'com.google.ar.sceneform.ux.ArFragment'. What can I do with this situation?

mainActivity.java

I have imported the com.google.ar.sceneform.ux.ArFragment.

public class MainActivity extends AppCompatActivity {

    private ArFragment arFragment;
    @Override
    @SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"})
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.fragment);
    }
}

activty_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/fragment"
        android:name="com.google.ar.sceneform.ux.ArFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true" />

</RelativeLayout>
1

There are 1 best solutions below

1
On

Ref:Ar Fragment Blog

Here is an example where the AR Fragment is used inside another Fragment. You can take this approach

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.Nullable
import com.google.ar.core.*

class MyFragment : Fragment() {

    private lateinit var arFragment: MyARFragment
    private var arShowing: Boolean = false

    override fun onCreateView(
        inflater: LayoutInflater, @Nullable container: ViewGroup?, @Nullable savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_sample, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        arFragment = childFragmentManager.findFragmentById(R.id.ar_fragment) as MyARFragment
        arFragment.arSceneView.scene
            .addOnUpdateListener {
                onUpdateFrame()
            }
     }

    private fun onUpdateFrame() {
        val frame = arFragment.arSceneView.arFrame ?: return
        // If there is no frame, just return.
        val updatedAugmentedImages =
            frame.getUpdatedTrackables(
                AugmentedImage::class.java
            )
        for (augmentedImage in updatedAugmentedImages) {
            when (augmentedImage.trackingState) {
                TrackingState.TRACKING -> {
                    if(!arShowing){
                        val anchor =  arFragment.arSceneView.session!!.createAnchor(augmentedImage.centerPose)
                        val node =
                            MyViewNode(context)
                        node.setImage(augmentedImage, anchor)
                        arFragment.arSceneView.scene.addChild(node)
                        arShowing = true
                    }
                }
                TrackingState.STOPPED -> {
                    arShowing = false
                }
            }
        }
    }
}