一个按钮的多个onClickListener

时间:2016-07-12 08:46:42

标签: android android-fragments onclicklistener

我有一个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会禁用第一个。在这种情况下,只剩下回调。

另外,在仔细考虑之后,它会使代码更容易理解。回调,是啊!

6 个答案:

答案 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();
    }
});
    }