2011-12-20 1 views
8

Я прочитал несколько статей о фрагментах, но я все еще смущен о том, как это сделать.Фрагменты метода onClick в элементе фрагмента

У меня есть MainActivity, которая отображает два фрагмента бок о бок. В одном из фрагментов У меня есть кнопка, и определяется в фрагменты макета XML для кнопки

android:onClick="buttonClicked" 

Теперь я хочу, чтобы реализовать этот метод

public void buttonClicked(View view) 

Я предположил бы, что это должно быть реализовано в FragmentA.java, а не в MainActivity.java. Но он работает только в том случае, если этот метод реализован в MainActivity.java. Почему это? Для меня это не имеет смысла. Pre Honeycomb метод, принадлежащий одному активству, остался в этой активности, теперь на планшете я объединяю многие действия в одну MainActivity, и все разные методы объединяются? Что бы вы ни делали, например, в FragmentA.java? Что делать, если вы должны начать свою собственную деятельность, потому что это приложение работает на карманном компьютере, тогда метод onClick не должен находиться в MainActivity, а в Activity, который нужно вызвать тогда. Я довольно запутан в данный момент ...

+0

Возможно, потому, что фрагмент xml раздувается с использованием основного контекста действий. Посмотрим, что ответят другие. – blessenm

+0

Что значит «это работает, только если метод реализован в« MainActivity.java ». Вы получаете ошибку, или ваш код просто не дает вам результат, которого вы ожидаете? –

+3

http://stackoverflow.com/questions/7570575/onclick-inside-fragment-called-on-activity Здесь тот же вопрос. – kzotin

ответ

4

Я не уверен, какова конкретная проблема, но, возможно, это поможет.

Из документации Android на Fragment s:

Вы должны спроектировать каждый фрагмент в качестве модульного и многократно используемого компонента деятельности. То есть, поскольку каждый фрагмент определяет свой собственный макет и его собственное поведение с его собственными обратными вызовами жизненного цикла, вы можете включить один фрагмент в несколько действий, поэтому вы должны проектировать для повторного использования и избегать прямого управления одним фрагментом из другого фрагмента.

То есть вы никогда не должны манипулировать фрагментом из другого фрагмента; скорее, это должно быть сделано через основную деятельность. Прочтите раздел «Создание обратных вызовов событий для активности» в этом article для получения дополнительной информации (это важно!).

С другой стороны, если вы хотите, чтобы кнопка выполнить действие внутри самого Fragment (то есть, если вы хотели Button нажмите, чтобы изменить текст TextView внутри фрагмента), вы должны осуществить это в Fragment, а не Activity (это связано с тем, что полученное поведение содержится в пределах Fragment и не имеет ничего общего с родителем Activity).

Оставить комментарий, и я могу уточнить, запутан ли мой пост ... Я только недавно начал понимать, что я сам Fragment :).

+4

Я могу подтвердить, что беспокойство AndyAndroid обосновано. И у меня такая же проблема с TabHost и несколькими FragmentActivity. В принципе, мой метод onClick, который вызывается в макете, ожидает, что этот метод будет определен в классе TabHost, а не в фрагменте. Отсюда большая проблема. –

+0

Возможно, я не читаю правильно, это отмечено как ответ, но как я могу заставить 'onClick' прослушивать внутри фрагмента, не прибегая к программному программированию? – katit

0

Ну,

Я предполагаю, что это связано с иерархией андроида структуру контекста. Деятельность - это хост всех дочерних представлений, и поэтому вы можете сказать, что фрагмент на самом деле использует контекст своего хоста. И поэтому, когда вы используете onClick с системой фрагментов, он всегда ищет ее в активности хоста фрагмента.

Проверьте его. Android developer onClick attribute description

Я не проверял одну вещь, но вы можете поставить тест. Предоставляя реализацию в активности хоста, а не в фрагменте, но используйте onClick в файле макета фрагмента. Он должен вызывать метод родителя.