在为Android制作自定义组件时,据我所知,我需要:
试图制作一个,只是为了练习。在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的正确方法是什么?
答案 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 = { }
最好的是,您可以在组件上发送数据并在平台中接收数据