2014-01-19 12 views
1

Сначала я раздуваю макет, а затем добавляю представление к нему с помощью addView(). В макете прикреплен OnLongClickListener.Android - проблема с OnClickListener и OnLongClickListener

Если я теперь добавлю OnClickListener во внутренний вид, OnLongClickListener больше не срабатывает. Как я могу это исправить?

Пример кода:

View someLayout = getLayoutInflater().inflate(R.layout.some_layout, null); 
someLayout.setOnLongClickListener(new OnLongClickListener() { 

    @Override 
    public boolean onLongClick(View arg0) { 
      ... 
     return true; 
     } 
}); 

TextView innerView = new TextView(this); 

innerView.setText("JustSomeTextThatDoesNotMatter"); 
innerView.setOnClickListener(new OnClickListener() {  
    @Override 
     public void onClick(View arg0) { 
      ... 
    ); 
} 
}); 

((FrameLayout) view.findViewById(R.id.framelayout)).addView(innerView); 

Layout

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" > 

    <FrameLayout 
     android:id="@+id/framelayout" 
     android:layout_width="300dp" 
     android:layout_height="wrap_content"> 
    </FrameLayout> 

</LinearLayout> 

Любые идеи? Это действительно кажется странным.

Обновление: То же самое происходит, когда я использую onTouchListener вместо onLongClickListener, OnClickListener во внутреннем представлении потребляет все события касания.

Это по дизайну? В основном я хочу использовать те же функции, что и ContextMenu для ListView.

+0

Простейшим решением было бы добавить такой же OnLongClickListener в innerView. Более сложным решением было бы реализовать метод onInterceptTouchEvent() в родительском LinearLayout и реализовать там LongPressListener. –

+1

Просто убедитесь, что вы следуете правилу возвращаемого значения onLongClickListener. Значит, если вы хотите передать длинный клик на родительский вид, тогда верните false, иначе верните true. http://developer.android.com/reference/android/view/View.OnLongClickListener.html – AndRSoid

+0

Я предполагаю, что 'OnLongClick()' прослушиватель больше не срабатывает только для «TextView», но в другом месте находится макет? – Kerry

ответ

6

Кликаемый View потребляет все события прикосновения и не дает им вернуться к родительскому. Поэтому единственный способ зарегистрировать длительные клики по всей области макета, содержащего clickable View s, - также зарегистрировать слушателя на каждом кликвом View внутри макета.

+0

Благодарим вас за разъяснение. Итак, как работает шаблон ContextMenu? Если вы вызываете registerForContextMenu в ListView, все LongClicks пойманы, независимо от каких-либо CLickListeners в элементах списка. –

+0

@PhilippEbert: Регистрация 'ContextMenu' (будь то в' ListView' или что-то еще) не делает ничего особенного, за исключением того, что просмотр можно долго кликать, поэтому он не должен иметь никакого другого поведения. – corsair992

+0

Спасибо. Было бы неплохо, если бы это было объяснено в документации. – muthuraj

Смежные вопросы