如何使用Fragments中的XML onClick处理按钮点击

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

android:onClick="myClickMethod"

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

随着Honeycomb的推出,我将这些活动分解成可在许多不同活动中重用的碎片。 这些按钮的大部分行为都是独立于Activity的,我希望代码驻留在Fragments文件中,而不必使用为每个按钮注册OnClickListener的旧(前1.6)方法。

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

问题是,当我的布局膨胀时,它仍然是托管活动,接受按钮点击,而不是个别碎片。 是否有一个好方法

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

  • 你可以这样做:

    活动:

    Fragment someFragment;    
    
    //...onCreate etc instantiating your fragments
    
    public void myClickMethod(View v) {
        someFragment.myClickMethod(v);
    }
    

    分段:

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

    为了回应@Ameen谁想要更少的耦合,所以碎片可重复使用

    接口:

    public interface XmlClickable {
        void myClickMethod(View v);
    }
    

    活动:

    XmlClickable someFragment;    
    
    //...onCreate, etc. instantiating your fragments casting to your interface.
    
    public void myClickMethod(View v) {
        someFragment.myClickMethod(v);
    }
    

    分段:

    public class SomeFragment implements XmlClickable {
    
    //...onCreateView, etc.
    
    @Override
    public void myClickMethod(View v) {
        switch(v.getId()){
            // Just like you were doing
        }
    }    
    

    我更喜欢使用以下解决方案来处理onClick事件。 这也适用于Activity和Fragments。

    public class StartFragment extends Fragment implements OnClickListener{
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
    
            View v = inflater.inflate(R.layout.fragment_start, container, false);
    
            Button b = (Button) v.findViewById(R.id.StartButton);
            b.setOnClickListener(this);
            return v;
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.StartButton:
    
                ...
    
                break;
            }
        }
    }
    

    我认为问题在于视图仍然是活动,而不是片段。 这些片段没有任何独立的视图,并附加到父活动视图。 这就是为什么事件结束在活动,而不是片段。 它不幸,但我认为你需要一些代码来完成这项工作。

    我在转换过程中所做的只是添加一个调用旧事件处理程序的点击侦听器。

    例如:

    final Button loginButton = (Button) view.findViewById(R.id.loginButton);
    loginButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(final View v) {
            onLoginClicked(v);
        }
    });
    
    链接地址: http://www.djcxy.com/p/24155.html

    上一篇: How to handle button clicks using the XML onClick within Fragments

    下一篇: Example: Communication between Activity and Service using Messaging