在Android自定义组件上添加setOnClickListener

时间:2016-06-29 12:26:01

标签: java android xml

在为Android制作自定义组件时,据我所知,我需要:

  • 一个包含组件布局的xml文件;
  • 一个java类。

试图制作一个,只是为了练习。在XML中使用两个进度条和一个按钮,并创建类,而不是在我的主要活动中尝试过,工作正常。

但是现在我已经开始讨论如何通过活动在我的按钮上设置OnClickListener,在这部分我迷失了。

我的loading_button.xml:

<merge
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<RelativeLayout
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:progress="0"
        android:id="@+id/pg_top" />

    <Button
        android:text="Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn_ok"
        android:background="@color/colorPrimary"
        android:textColor="#ffffff"
        android:layout_below="@+id/pg_top"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:progress="0"
        android:id="@+id/pg_bottom"
        android:layout_below="@+id/btn_ok"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</RelativeLayout>

</merge>

这里是LoadingButton.java:

public class LoadingButton extends RelativeLayout{

private ProgressBar pbTop;
private ProgressBar pbBottom;
private Button btnOk;

private int pbTopProgress = 0;
private int pbBottomProgress = 0;

public LoadingButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    View view = View.inflate(context, R.layout.loading_button, this);

    btnOk = (Button) view.findViewById(R.id.btn_ok);
    pbTop = (ProgressBar) view.findViewById(R.id.pg_top);
    pbBottom = (ProgressBar) view.findViewById(R.id.pg_bottom);

    btnOk.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // Doing stuff ok
        }
    });

}// LoadingButton
}

该类中的setOnClickListener有效,但如何从主要活动中设置它?

MainActivity:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // My new component (it's id in activity_main.xml is 'lb') 
    LoadingButton lb = (LoadingButton) findViewById(R.id.lb);

    // QUESTION - how to make something like this with btnOk:
    lb.btnOkSetOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View v) {
          // Do stuff
       }
    });
  }
}

如果可以,怎么做?

如果没有,在这个组件的特定元素上制作自定义组件和设置clickListeners的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

在LoadingButton中处理所有视图点击的最佳方法(对于自定义视图)。并创建界面。

public class LoadingButton extends RelativeLayout {


    public interface OnLoadingButtonClickListener{
        void onLoadingButtonClickListener();
    }

    private ProgressBar pbTop;
    private ProgressBar pbBottom;
    private Button btnOk;

    private int pbTopProgress = 0;
    private int pbBottomProgress = 0;
    private OnLoadingButtonClickListener mONOnLoadingButtonClickListener;

    public LoadingButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        View view = View.inflate(context, R.layout.loading_button, this);

        btnOk = (Button) view.findViewById(R.id.btn_ok);
        pbTop = (ProgressBar) view.findViewById(R.id.pg_top);
        pbBottom = (ProgressBar) view.findViewById(R.id.pg_bottom);

        btnOk.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mONOnLoadingButtonClickListener != null){
                    mONOnLoadingButtonClickListener.onLoadingButtonClickListener();
                }
            }
        });

    }// LoadingButton

    public void setOnLoadingClickListener(OnLoadingButtonClickListener onLoadingClickListener){
        mONOnLoadingButtonClickListener = onLoadingClickListener;
    }


}

在您的活动中实施OnLoadingButtonClickListener。

public class MainActivity extends AppCompatActivity implements LoadingButton.OnLoadingButtonClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // My new component (it's id in activity_main.xml is 'lb') 
        LoadingButton lb = (LoadingButton) findViewById(R.id.lb);
        lb.setOnLoadingClickListener(this);

    }

    @Override
    public void onLoadingButtonClickListener() {
        //do your stuff on ok button click
    }
}

答案 1 :(得分:0)

覆盖自定义Java类中的setOnClickListener(OnClickListener listener)。在里面,写一下:

btnOk.setOnClickListener(受听者);

其中listener是自定义视图的setOnClickListener()函数的参数。

这将使您的整个视图可以点击,然后点击您的按钮即可执行。然后将android:clickable="true"添加到自定义视图的根布局中。

答案 2 :(得分:0)

在组件中

class Example @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0,
defStyleRes: Int = 0) : ConstraintLayout(context, attrs, defStyle) {

var clickListener: () -> Unit = { }

init { }

private fun initListeners() {
    binding.button.onClick {
        clickListener()
    }
}

活动/片段中

component.clickListener = { }

最好的是,您可以在组件上发送数据并在平台中接收数据