2016-11-17 3 views
2

Я создал свой собственный класс, чтобы имитировать Snackbar, позволяет называть его CustomSnackbar. То, что я пытаюсь достичь, - это настроить закусочную и иметь возможность вызвать CustomSnackbar из моего основного вида деятельности, а использование будет очень похоже на вызов стандартной Snackbar. Для целей демонстрации моего примера без всего сыпучего кода, вот мой CustomSnackbar класс:Как использовать onClickListener с моим собственным классом

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 внутри класса

Пожалуйста, проигнорируйте тот факт, что класс может казаться бессмысленным (но это потому что я упростили его для целей этого вопроса). Я не уверен, что правильно создаю этот класс, поэтому любые дополнительные советы или предложения будут оценены. Благодарю.

ответ

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

+0

спасибо. Из вашего примера я могу ясно видеть, чего мне не хватало, и как просто было разрешить. – WizzKidd

+0

В качестве дополнения к моему вопросу (не уверен, как правильно это поместить в SO), как я могу имитировать классы Snackbar другими методами. Должен ли я расширять класс Snackbar из класса CustomSnackbar? Если это так, у вас есть пример, где мне нужно будет переопределить метод .make для меня. Имеет ли это смысл? – WizzKidd

+0

Ваш текущий код выглядит как простой «Помощник», который сохраняет некоторые статические методы из вашего «основного кода», например «Активность». это просто подход, который вы выбрали, и все в порядке. вы также можете расширить оригинальный 'SnackBar', тогда вы должны поместить свой код из имени с именем« make »в конструктор или любой другой метод, внутри которого вы будете уверены, что« макет SnackBar уже реализован. Я теперь не твоя идея (как ты сказал, ты отрезал какой-то код).По моему мнению, версия «Помощник» может быть более удобной, и вы также можете предоставить дополнительный метод getOriginalSnackBar() с помощью 'back snackbar;' – snachmsm

1

вы должны указать его как параметр для вашего метода setAction. Например.

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

и либо передать предоставленный экземпляр, или прокси-вызов на другой объект

1

ли класс расширяет Snackbar.

Тогда addMouseListener (classWithExtendedSnackbar)

0

I я точно не понимаю о вашем вопросе. Но, если вы хотите создать пользовательскую 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(); 
} 
Смежные вопросы