2012-07-16 4 views
0

Я пытаюсь подклассифицировать MediaController, чтобы сделать его полностью настраиваемым (я не собираюсь использовать метод vidtry, потому что у меня есть некоторый старый код, который я не могу изменить).Невозможно перехватывать события касания в пользовательском подклассе MediaController

Мой код выглядит примерно так:

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... 
} 

}

Теперь, я получил все элементы управления видны, и все они реагируют на их действия по щелчку/касанию, но когда я нажимаю/касаюсь окна MC вместо вызова переопределенного onTouchEvent, поскольку я ожидал, что onCouch окна MediaController будет вызван, как это можно увидеть в callstack :

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 

возникает вопрос нужно ли мне заменить декор окна сенсорного слушателя или есть лучший путь, и я что-то не хватает?

p.s. Я работаю с lv. 9 API.

Спасибо!

ответ

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> 

Надеется, что это поможет в один прекрасный день кто-то :)