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
    }
});

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

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


当前回答

在布伦德尔的回答中, 如果你有更多的片段,有足够的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
     }
  } 

其他回答

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

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

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

mViewPagerCloth.setOnClickListener(this);

并在Fragment上实现onClickListener接口

在布伦德尔的回答中, 如果你有更多的片段,有足够的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
     }
  } 

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

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

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

在我的用例中,我有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);
        }
    }

这对我来说很管用:(Android工作室)

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.update_credential, container, false);
        Button bt_login = (Button) rootView.findViewById(R.id.btnSend);

        bt_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                System.out.println("Hi its me");


            }// end onClick
        });

        return rootView;

    }// end onCreateView