2016-07-12 5 views
2

У меня есть ImageButton Я могу получить доступ к своей работе и в своем фрагменте. Я хочу, чтобы действия выполнялись в обоих указанных классах, поэтому я реализовал onClickListener для обоих из них.Несколько onClickListener для одной кнопки

 @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity); 

     ImageButton imageButton = (ImageButton) findViewById(R.id.my_image_button); 
     imageButton.setOnClickListener(new OnClickListener() ...); 
    } 

И тот же самый простой кусок кода для фрагмента запущенного этой деятельности (Но в onViewCreated).

Я попробовал, и активирован только onClickListener фрагмента.

Итак, вот мой вопрос, есть ли способ заставить мою кнопку запускать как Activity, так и Fragment's onClickListener?

Я знаю, что я мог бы вызвать метод Фрагмента из onClick Activity, но было бы намного проще просто запустить его внутри Фрагмента.

EDIT:

Я не готово сделать это через два OnClickListener любой цена, это было только в случае, если было более простым способом, чем активность фрагмента обратных вызовов (в моем случае) ,

Как сказал 空 気,, второй onClickListener отключит первый. В этом случае останутся только обратные вызовы.

Плюс, подумав немного об этом, это сделает код более понятным. Обратные вызовы, да!

+2

* активировать как Activity, так и Fragment onClickListener? * В то же время? –

+0

Да. Два onClickListeners в разных классах для одного события. – Cedric

+0

Вы попробовали 'getActivity(). ImageButton.setOnClickListener (новый OnClickListener() ...);' (define 'imageButton' as public) –

ответ

0

View.setOnClickListener поддерживает только набор одного слушателя. Если вы его дважды назовете, более поздний слушатель будет охватывать бывшего слушателя, и будет уведомлен только более поздний слушатель. Так что вызов метода Фрагмента из ActivityClick Activity кажется хорошим для вас. И если ImageButton определен в макете действия, хорошо иметь дело с ним только в Activity, например, уведомлять других и выставлять некоторые методы.

+0

Итак, два onClickListener невозможно, спасибо. – Cedric

3

Я столкнулся с подобной ситуацией, работая над проектом несколько недель назад. У меня был метод в моем фрагменте и один в моей деятельности. Для того, чтобы называть их обоих, я поставил кнопку в фрагменте, и в храповой слушателя, я назвал их:

YourFragmentMethod(); //fragment actions 
((YourActivity)getActivity()).yourActivityPublicMethod(); //activity actions 

Таким образом, вы можете запустить два действия с одним onClickListener, который, кажется, лучший вариант для меня чем два слушателя на одном элементе.

0

В YourActivity

public ImageButton imageButton; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    imageButton = (ImageButton) findViewById(R.id.my_image_button); 
} 

В вашей Fragment

((YourActivity) getActivity()).imageButton.setOnClickListener(new OnClickListener() ...); 
+0

Только что попробовал, этот новый OnClickListener запускается, но не Activity one. – Cedric

0

Вы не должны создать 2 слушателей на том же событии в случае использования фрагмента и активности.

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

Подробнее о связи между действиями и фрагментами here.

+0

Я понимаю, я просто хотел узнать, есть ли другой способ. – Cedric

0

Создать на OnClickListner inerface как этот

interface OnClickListner{ 
    void OnClick(View v); 
} 

Объявить этот интерфейс как статические в вашей деятельности

public static OnClickListner onClickListner; 

Написать функцию, которая принимает OnClickListner inteface в качестве параметра активности

public void setOnClickListner(OnClickListner onClickListner){ 
    this.onClickListner=onClickListner; 
} 

Добавьте View.OnClickListner для своей кнопки в своей деятельности, как и ТЗА

imageButton.setOnClickListener(new OnClickListener() { 
@override 
onClick(View v){ 
    performActivitiesAction(); 
    //trigger fragment click listner 
    if(onClickListner!=null){ 
    onClickListner.OnClick(v); 
    } 

}); 

В вашем фрагменте создать объект для вашей деятельности и применять setonclick у слушателя

MyActivity myActivity=new MyActivity(); 
myActivity.setOnClickListner(new OnClickListner(){ 
    override 
    OnClick(View v){ 
     //Write your fragment's click listner functions here 
    } 
}); 
0

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

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity); 

     ImageButton imageButton = (ImageButton) findViewById(R.id.my_image_button); 
     imageButton.setOnClickListener(new OnClickListener(){ 
    // TODO: your actions in the activity 
    // check if fragment is not null and call custom method 
    if(mFragment != null){ 
     mFragment.onMainButtonClicked(); 
    } 
}); 
    } 
+0

способ получить ваш фрагмент: 'ExampleFragment fragment = (ExampleFragment) getFragmentManager(). FindFragmentById (R.id.example_fragment);' Тогда я согласен, если не использовать 2 onClick, вот как я это сделаю. – Cedric

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