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

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

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


当前回答

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

在片段:

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

其他回答

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

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

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

这对我来说很管用:(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

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

在片段:

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

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

在处理片段时,我宁愿在代码中使用单击处理,而不是在XML中使用onClick属性。

这在将活动迁移到片段时变得更加容易。你可以直接从每个case块调用click处理程序(以前在XML中设置为android:onClick)。

findViewById(R.id.button_login).setOnClickListener(clickListener);
...

OnClickListener clickListener = new OnClickListener() {
    @Override
    public void onClick(final View v) {
        switch(v.getId()) {
           case R.id.button_login:
              // Which is supposed to be called automatically in your
              // activity, which has now changed to a fragment.
              onLoginClick(v);
              break;

           case R.id.button_logout:
              ...
        }
    }
}

当涉及到处理片段中的点击,这看起来比android:onClick更简单。