0

MediaControllerを完全にカスタマイズできるようにするために、サブクラス化しようとしています(変更できないレガシーコードがあるため、 vidtryアプローチは使用しません)。

私のコードはおおよそ次のようになります。

mc_layout.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

    <LinearLayout
        android:id="@+id/top"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        ...>

        // Some buttons

    </LinearLayout>

    <LinearLayout
        android:id="@+id/bottom"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        ... >

        // Some buttons

    </LinearLayout>

mc_subclass.java:

public class MCSubclass extends MediaController {

private View mRoot;

GestureDetector mGestureDetector = new GestureDetector(getContext(), new SimpleOnGestureListener() {

    @Override
    public boolean onDown(MotionEvent e) {
     // Do something.
        return true;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
       // Do something.
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        // Do something.
        return false;
    }
});

public MCSubclass(final Context context) {
    super(context);
}

public boolean onTouchEvent(final MotionEvent event) {
// NEVER CALLED!
    return mGestureDetector.onTouchEvent(event);
}

public final void setAnchorView(final View view) {
    super.setAnchorView(view);
    FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT
    );

    removeAllViews();
    View v = makeControllerView();
    addView(v, frameParams);
}

private View makeControllerView() {
    LayoutInflater inflate = (LayoutInflater) getContext().getSystemService(
        Context.LAYOUT_INFLATER_SERVICE);

    mRoot = inflate.inflate(R.layout.mc_layout, null);
    initControllerView(mRoot);
    return mRoot;
}

private void initControllerView(View v) {
    mPlayButton = (ImageButton) v.findViewById(R.id.playBtn);
    if (mPlayButton != null) {
        mPlayButton.requestFocus();
        mPlayButton.setOnClickListener(mOnClickListener);
    }
// Init other views...
}

}

これで、すべてのコントロールが表示され、すべてのコントロールがクリック/タッチアクションに応答しますが、MediaControllerの装飾ウィンドウのonTouchが呼び出されると予想したように、オーバーライドされたonTouchEventを呼び出す代わりに、MCウィンドウをクリック/タッチすると、コールスタックで見られる:

MediaController$1.onTouch(View, MotionEvent) line: 149  
PhoneWindow$DecorView(View).dispatchTouchEvent(MotionEvent) line: 3762  
PhoneWindow$DecorView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 897  
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent) line: 1862    
ViewRoot.handleMessage(Message) line: 1809  
ViewRoot(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 123 

問題は、装飾ウィンドウのタッチリスナーを交換する必要があるのか​​、それとももっと良い方法があり、何かが足りないのかということです。

ps私はlvで働いています。9API。

ありがとう!

4

1 に答える 1

1

見つけた!問題は、単一のアイテムのみを表示でき、サイズが最大の子のサイズであるFrameLayoutを使用することです。ですから、私の場合は、思ったように画面全体をカバーするのに十分な大きさではありませんでした。その結果、装飾ウィンドウは、完全に理にかなっているタッチイベントを処理することになりました。

とにかく、作業レイアウトは次のようになります。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ...>

        // Some buttons

    </LinearLayout>

    <LinearLayout
        android:id="@+id/bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ... >

        // Some buttons

    </LinearLayout>
    ....
</RelativeLayout>   

これが誰かにいつか役立つことを願っています:)

于 2012-07-17T10:29:52.053 に答える