Java 如何在我自己的类中使用onClickListener
我创建了自己的类来模仿Snackbar,让我们称之为CustomSnackbar。我试图实现的是定制snackbar,并能够从我的主要活动中调用CustomSnackbar,其用法与调用标准snackbar非常相似。为了演示没有所有批量代码的示例,下面是我的CustomSnackbar类:Java 如何在我自己的类中使用onClickListener,java,android,class,onclicklistener,android-snackbar,Java,Android,Class,Onclicklistener,Android Snackbar,我创建了自己的类来模仿Snackbar,让我们称之为CustomSnackbar。我试图实现的是定制snackbar,并能够从我的主要活动中调用CustomSnackbar,其用法与调用标准snackbar非常相似。为了演示没有所有批量代码的示例,下面是我的CustomSnackbar类: package com.wizzkidd.myapp.helpers; import android.content.Context; import android.support.design.widge
package com.wizzkidd.myapp.helpers;
import android.content.Context;
import android.support.design.widget.Snackbar;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class CustomSnackbar {
Context _context;
Snackbar snackbar;
public CustomSnackbar(Context context) {
this._context = context;
}
public void make(View view, CharSequence text, int duration) {
snackbar = Snackbar.make(view, "", duration);
Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) snackbar.getView();
TextView textView = (TextView) snackbarLayout.findViewById(android.support.design.R.id.snackbar_text);
textView.setVisibility(View.INVISIBLE); //hide the default snackbar textview
//Create my own textview instead
TextView myTextView = new TextView(_context);
myTextView.setText(text);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); //Create layout params for some text
myTextView.setLayoutParams(params); //Apply the text layout params
snackbarLayout.addView(myTextView); //Add my text to the main snackbar layout. (Other widgets will also be added)
}
public void setAction(CharSequence text) {
snackbar.setAction(text, new View.OnClickListener() {
@Override
public void onClick(View view) {
//do something
Log.v("TAG", "You clicked the action");
}
});
}
public void show() {
snackbar.show();
}
}
在我的主要活动中,我使用的类如下:
CustomSnackbar customSnackbar = new CustomSnackbar(activity);
customSnackbar.make(view, "This is my snackbar", Snackbar.LENGTH_INDEFINITE);
customSnackbar.setAction("HIDE");
customSnackbar.show();
您可以看到,我正在使用.setAction方法传递string/charsequence,但我不确定如何在同一调用中处理onClickListener,而不是在类中处理onClickListener
请忽略这个事实,这个类可能看起来毫无意义(但这是因为我为了这个问题简化了它)。我不确定我是否正确创建了这个类,因此任何额外的建议或建议都将不胜感激。谢谢。您必须将其作为参数提供给您的
设置操作
方法。例如
public void setAction(CharSequence text, final View.OnClickListener listener) {
并将提供的实例传递给另一个对象,或者将调用代理给另一个对象,这样就可以扩展Snackbar类
然后添加MouseListener(classWithExtendedSnackbar)在其他地方声明您的
OnClickListener
,例如在调用方法的活动中,并将其传递给类
final View.OnClickListener ocl = new View.OnClickListener() {
@Override
public void onClick(View view) {
//do something
Log.v("TAG", "You clicked the action");
}
}
CustomSnackbar customSnackbar = new CustomSnackbar(activity);
customSnackbar.make(view, "This is my snackbar", Snackbar.LENGTH_INDEFINITE);
customSnackbar.setAction("HIDE", ocl);
customSnackbar.show();
在自定义类中:
public void setAction(CharSequence text, final View.OnClickListener ocl) {
snackbar.setAction(text, ocl);
}
现在在OnClickListener
中,您可以从Activity
调用方法,我完全不清楚您的问题。但是,如果您想制作一个自定义的Snackbar,它将显示您的所有消息,并在单击它时提供功能。然后你可以试试这个代码
只需调用此方法来制作一个snackbar
//Here I am sending one as code
showMessage("Snackbar Opened","Close",1)
//send different code based on which you can set something to be done, or identify a button click
private void showMessage(String msg, String action_name, final int code) {
progress.cancel();
final Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), msg, Snackbar.LENGTH_INDEFINITE);
snackbar.setAction(action_name, new View.OnClickListener() {
@Override
public void onClick(View v) {
clearDataForListView();
if (code == 1) {
//do something if code is one/if a particular button is clicked
//you can dismiss anwhere else also.
snackbar.dismiss();
} else if (code == 2) {
//do something if another button is pressed
snackbar.dismiss();
}
}
});
snackbar.show();
}
非常感谢。从你的例子中,我可以清楚地看到我遗漏了什么,解决起来有多么简单。作为我问题的延伸(不知道如何正确地表达),我如何模仿Snackbar类和其他方法。我应该从CustomSnackbar类扩展Snackbar类吗?如果是这样的话,您是否有一个我需要覆盖.make方法以适合我的示例。这有意义吗?您当前的代码看起来像一个简单的“助手”,它将一些静态方法排除在您的“主代码”之外,如活动
。这只是你选择的一种方法,很好。您也可以扩展原始的SnackBar
,然后您应该将当前命名的“make”方法中的代码放入构造函数或任何其他方法中,在这些方法中,您将看到舒尔已经实现了SnackBar
的布局。我现在不知道你的全部想法(就像你说的,你删掉了一些代码)。我认为“Helper”版本可能更方便,您还可以使用返回snackbar提供额外的getOriginalSnackBar()
方法谢谢,我想你是对的。它是一个简单的助手类,不需要太多代码就符合我的目的。我不需要把这件事过分复杂化。