如何使用onClickListener与我自己的类

时间:2016-11-17 11:27:00

标签: java android class onclicklistener android-snackbar

我创建了自己的类来模仿Snackbar,我们称之为CustomSnackbar。我想要实现的是自定义快餐栏,并能够从我的主要活动调用CustomSnackbar,并且用法与调用标准Snackbar非常相似。为了演示没有所有批量代码的示例,这里是我的CustomSnackbar类:

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

在我的MainActivity中,我正在使用这样的类:

CustomSnackbar customSnackbar = new CustomSnackbar(activity);
customSnackbar.make(view, "This is my snackbar", Snackbar.LENGTH_INDEFINITE);
customSnackbar.setAction("HIDE");
customSnackbar.show();

你可以看到我正在使用我的.setAction方法传递一个字符串/ charsequence但是我不确定如何在同一个调用中处理onClickListener而不是处理类中的onClickListener

请忽略这个类可能看起来毫无意义的事实(但这是因为我为了这个问题而简化了它)。我不确定我是否正确创建了这个课程,因此我们将不胜感激任何其他建议或建议。感谢。

4 个答案:

答案 0 :(得分:1)

您必须将其作为参数提供给setAction方法。 E.g。

public void setAction(CharSequence text, final View.OnClickListener listener) {

并传递提供的实例,或将调用代理到另一个对象

答案 1 :(得分:1)

一个类是否扩展了Snackbar。

然后addMouseListener(classWithExtendedSnackbar)

答案 2 :(得分:1)

在其他地方声明您的OnClickListener,例如在Activity中,您正在调用您的方法,并将其传递给您的班级

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

中的方法

答案 3 :(得分:0)

我对你的问题并不清楚。但是,如果您想制作一个自定义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();
}