【问题标题】:how to use onClickListener with my own class如何在我自己的类中使用 onClickListener
【发布时间】:2016-11-17 11:27:00
【问题描述】:

我创建了自己的类来模仿 Snackbar,我们称之为 CustomSnackbar。我想要实现的是自定义snackbar,并能够从我的主要活动中调用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 方法来传递字符串/字符序列,但我不确定如何在同一个调用中处理 onClickListener 而不是在类中处理 onClickListener

请忽略该类可能看起来毫无意义的事实(但这是因为我出于本问题的目的对其进行了简化)。我不确定我是否正确地创建了这个类,所以任何额外的建议或建议将不胜感激。谢谢。

【问题讨论】:

    标签: java android class onclicklistener android-snackbar


    【解决方案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 的方法

    【讨论】:

    • 谢谢。从您的示例中,我可以清楚地看到我缺少什么,以及解决问题的简单程度。
    • 作为我的问题的扩展(不确定如何以正确的方式将其放入 SO),我该如何去模仿 Snackbar 类的其他方法。我应该从我的 CustomSnackbar 类扩展 Snackbar 类吗?如果是这样,您是否有一个示例,我需要覆盖 .make 方法以适合我。这有意义吗?
    • 您当前的代码看起来像简单的“助手”,它将一些静态方法排除在您的“主代码”之外,例如Activity。这只是您选择的一种方法,很好。你也可以扩展原来的SnackBar,然后你应该把你的代码从当前命名的“make”方法放到构造函数或任何其他方法中,你将在其中确保SnackBars 布局已经实现。我现在不知道你的全部想法(就像你说的,你削减了一些代码)。在我看来,“Helper”版本可能更方便,您还可以使用return snackbar; 提供额外的getOriginalSnackBar() 方法
    • 谢谢,我认为你是对的。它充当一个简单的 Helper 类,无需太多代码即可满足我的目的。我不需要过度复杂化。
    【解决方案2】:

    您必须将它作为参数提供给您的setAction 方法。例如

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

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

    【讨论】:

      【解决方案3】:

      做一个类扩展 Snackbar。

      然后addMouseListener(classWithExtendedSnackbar)

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2012-01-31
          • 2011-01-31
          • 2012-09-22
          • 2016-11-23
          • 1970-01-01
          • 2012-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多