Pre-Honeycomb (Android 3),每个Activity都注册为通过布局XML中的onClick标签处理按钮点击:

android:onClick="myClickMethod"

在该方法中,您可以使用view.getId()和switch语句来执行按钮逻辑。

随着蜂窝的引入,我将这些活动分解为片段,这些片段可以在许多不同的活动中重用。按钮的大部分行为是活动独立的,我想代码驻留在Fragments文件中,而不使用旧的(pre 1.6)方法为每个按钮注册OnClickListener。

final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Perform action on click
    }
});

问题是,当我的布局被膨胀时,它仍然是接收按钮点击的宿主活动,而不是单个片段。有没有好的方法来解决这两个问题

注册片段以接收按钮点击? 将点击事件从活动传递到它们所属的片段?


当前回答

您可以将回调定义为XML布局的属性。文章自定义XML属性为您的自定义Android小部件将向您展示如何做一个自定义小部件。这要归功于凯文·迪翁。

我正在研究是否可以向基Fragment类添加可样式的属性。

基本思想是在处理onClick回调时具有与View实现的相同的功能。

其他回答

恕我直言,最佳解决方案:

在片段:

protected void addClick(int id) {
    try {
        getView().findViewById(id).setOnClickListener(this);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void onClick(View v) {
    if (v.getId()==R.id.myButton) {
        onMyButtonClick(v);
    }
}

然后在Fragment的onviewstaterestrestored中:

addClick(R.id.myButton);

在布伦德尔的回答中, 如果你有更多的片段,有足够的onClicks:

活动:

Fragment someFragment1 = (Fragment)getFragmentManager().findFragmentByTag("someFragment1 "); 
Fragment someFragment2 = (Fragment)getFragmentManager().findFragmentByTag("someFragment2 "); 
Fragment someFragment3 = (Fragment)getFragmentManager().findFragmentByTag("someFragment3 "); 

...onCreate etc instantiating your fragments

public void myClickMethod(View v){
  if (someFragment1.isVisible()) {
       someFragment1.myClickMethod(v);
  }else if(someFragment2.isVisible()){
       someFragment2.myClickMethod(v);
  }else if(someFragment3.isVisible()){
       someFragment3.myClickMethod(v); 
  }

} 

在你的片段中:

  public void myClickMethod(View v){
     switch(v.getid()){
       // Just like you were doing
     }
  } 

你可能想要考虑使用EventBus来解耦事件。 你可以很容易地监听事件。你也可以确保事件是在ui线程上接收的(而不是调用runOnUiThread..)为您自己的每一个活动订阅)

https://github.com/greenrobot/EventBus

从Github:

Android优化事件总线,简化通信之间 活动、片段、线程、服务等等。代码越少越好 质量

你的Activity正在接收必须使用的回调:

mViewPagerCloth.setOnClickListener((YourActivityName)getActivity());

如果你想让你的片段接收回调,那么这样做:

mViewPagerCloth.setOnClickListener(this);

并在Fragment上实现onClickListener接口

在我的用例中,我有50个奇怪的imageview,我需要钩子到一个onClick方法。我的解决方案是在片段内循环视图,并在每个视图上设置相同的onclick侦听器:

    final View.OnClickListener imageOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            chosenImage = ((ImageButton)v).getDrawable();
        }
    };

    ViewGroup root = (ViewGroup) getView().findViewById(R.id.imagesParentView);
    int childViewCount = root.getChildCount();
    for (int i=0; i < childViewCount; i++){
        View image = root.getChildAt(i);
        if (image instanceof ImageButton) {
            ((ImageButton)image).setOnClickListener(imageOnClickListener);
        }
    }