我有一个ImageButton,我可以在我的Activity和我的Fragment中访问。 我希望在这两个类中完成操作,所以我为它们实现了一个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中)。
我试过了,只触发了Fragment的onClickListener。
所以,这是我的问题,有没有办法让我的按钮触发Activity和Fragment的onClickListener?
我知道我可以从Activity的onClick中调用Fragment的方法,但是在Fragment中触发它会简单得多。
编辑:
我不愿意通过两个OnClickListener 不惜一切代价来实现这一点,以防万一有一种比Activity to Fragment回调更简单的方法(在我的情况下) )。
正如空気嫁所说,第二个onClickListener会禁用第一个。在这种情况下,只剩下回调。
另外,在仔细考虑之后,它会使代码更容易理解。回调,是啊!
答案 0 :(得分:3)
YourFragmentMethod(); //fragment actions
((YourActivity)getActivity()).yourActivityPublicMethod(); //activity actions
这样,您可以使用单个onClickListener触发两个动作,这对我来说似乎比单个项目上的两个侦听器更好。
答案 1 :(得分:2)
View.setOnClickListener仅支持set one listener。如果您调用它两次,则后一个侦听器将覆盖前一个侦听器,并且只会通知稍后的侦听器。 所以从Activity的onClick调用Fragment的方法似乎对你有用。 如果ImageButton是在Activity的布局中定义的,那么最好只在Activity中处理它,例如通知其他人并暴露一些方法。
答案 2 :(得分:1)
在OnClickListner inerface上创建像这样的
interface OnClickListner{
void OnClick(View v);
}
在活动中将此接口声明为静态
public static OnClickListner onClickListner;
编写一个函数,它将OnClickListner接口作为activity
中的参数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 listner
MyActivity myActivity=new MyActivity();
myActivity.setOnClickListner(new OnClickListner(){
override
OnClick(View v){
//Write your fragment's click listner functions here
}
});
答案 3 :(得分: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() ...);
答案 4 :(得分:0)
如果使用片段和活动,则不应为同一事件创建2个侦听器。
让我们说你的按钮存在于片段布局中,而不是在片段代码中为该按钮设置监听器。之后,您必须注意有关该点击界面的活动。
详细了解活动和片段https://stackoverflow.com/a/13147366/4563947之间的沟通。
答案 5 :(得分: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();
}
});
}