0

私はアンドロイドプログラミングを学んでおり、練習のためにいくつかのDCモーターのコントローラーを作ろうとしています.次に、ontouchリスナーのインターフェイスとコールバックを使用する仮想ジョイパッドを作成するためのカスタムビューを作成しました.

問題は、単一の MainActivity を navhost として使用してアプリで作業していて、さまざまなフラグメントをナビゲートしていることです。MainActivity のインターフェイス メソッドをオーバーライドするとカスタムビューが機能しますが、機能させることはできませんジョイパッドのすべてのロジックを処理したい私のフラグメント。

数日間調査しましたが、見つけた投稿のほとんどは Java で書かれており、Kotlin で動作させることはできません。

私のカスタムビュークラス


class KanJoypadView: SurfaceView, SurfaceHolder.Callback, View.OnTouchListener{  

    ...kotlin
    var joypadCallback: JoypadListener? = null

    //the main constructor for the class
    constructor(context: Context): super(context){
        ...

        getHolder().addCallback(this)
        setOnTouchListener(this)

        ...
}

        //the interface for the main functionally of the view
        interface JoypadListener {
            fun onJoypadMove(x: Float, y: Float, src: Int){}
        }

        ...

}

私のメインアクティビティ


class NavActivity : AppCompatActivity(), KanJoypadView.joypadListener {
    ...
    
    //Overriding the Function from the interface, 
    //I just did this for debguging, but I dont want this override here
    override fun onJoypadMove(x: Float, y: Float, src: Int) {
        Log.d(src.toString(), y.toString()) //** I wanna do this in my Fragment, not in my activity **
    }

}

私のフラグメント


class JoystickFragment : Fragment(), KanJoypadView.joypadListener {

    ...

    var enginesArray = arrayOf(0.toFloat(), 0.toFloat(), 0.toFloat(), 0.toFloat())

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
    
    ...
    
        val binding = DataBindingUtil.inflate(
                inflater, R.layout.fragment_joystick, container, false
        )
        binding.leftJoypad.joypadCallback = (container?.context as KanJoypadView.JoypadListener?)
        lJoypad = binding.leftJoypad.id
    }

    /*what I really want to do, but it is not happening as it is just happenning the
 override from the NavActivity, which I dont need, and not from here which I need*/
    override fun onJoypadMove(x: Float, y: Float, src: Int) {
        if (src == lJoypad) {
            if (y >= 0) {
                enginesArray[0] = 1.toFloat()
                enginesArray[1] = y
            } else if (y < 0) {
                enginesArray[0] = 0.toFloat()
                enginesArray[1] = y
            }
            if (src == rJoypad) {
                if (y >= 0) {
                    enginesArray[0] = 1.toFloat()
                    enginesArray[1] = y
                } else if (yAxis < 0) {
                    enginesArray[0] = 0.toFloat()
                    enginesArray[1] = y
                }
                Log.d("Engines array", enginesArray.toString())
            }
        }
    }

}

また、フラグメントで関数を作成してから、アクティビティの onMoveJoypad メソッドからその関数を呼び出そうとしましたが、機能させることもできませんでした。これを実装する方法についてのヘルプやアドバイスをいただければ幸いです。事前に感謝します。

4

1 に答える 1