2016-11-17 2 views
2

Snackbar를 모방 한 클래스를 직접 만들었습니다. CustomSnackbar를 호출 할 수 있습니다. 내가 성취하고자하는 것은 스낵바를 커스터마이징하고 CustomSnackbar를 내 주요 활동에서 호출 할 수 있고 표준 Snackbar를 호출하는 것과 매우 유사하게 사용하는 것입니다. 모든 벌크 코드없이 내 예를 시연의 목적을 위해, 여기 내 CustomSnackbar 클래스입니다 : 내 MainActivity에서내 클래스에서 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(); 
    } 
} 

,이 같은 클래스를 사용하고 있습니다 :

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

을 당신이 I를 볼 수 있습니다 내 .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(); 

와 내부를 통과 : Activity

+0

고맙습니다. 귀하의 모범을 통해 내가 누락 된 부분과 해결 방법이 무엇인지 명확하게 알 수 있습니다. – WizzKidd

+0

내 질문에 대한 확장 (올바른 방법으로 이것을 넣는 방법을 모르겠다.)에서 Snackbar 클래스의 다른 메소드를 모방하는 방법은 무엇입니까? CustomSnackbar 클래스에서 Snackbar 클래스를 확장해야합니까? 그렇다면 당신은 나에게 맞는 .make 메소드를 오버라이드 (override)해야 할 예제가있다. 말이 돼? – WizzKidd

+0

현재 코드는 간단한 "Helper"처럼 보이므로 "Main code"에서 "Activity"와 같은 정적 메서드를 유지합니다. 그것은 당신이 골랐던 방법 일뿐입니다. 당신은 또한 원래의 SnackBar를 확장 할 수있다. 그런 다음 당신은 현재 "make"메소드의 코드를 생성자 나 다른 메소드에 넣어야한다. 그 안에는 SnackBar의 레이아웃이 이미 구현되어 있다는 것이 확실 할 것이다. 나는 당신이 생각한대로 (당신이 말했듯이, 당신은 약간의 코드를 잘라 냈습니다).제 의견으로는 "도우미"버전이 더 편리 할 수 ​​있으며'return snackbar;와 함께 추가 getOriginalSnackBar() 메소드를 제공 할 수도 있습니다. – snachmsm

1

setAction 방법에 매개 변수로 입력해야합니다. 예 :

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

및 중

클래스가 플로팅 작업 확장 수행 다른 물체

1

에 전화를 제공된 인스턴스를 전달, 또는 프록시.

그런 addMouseListener (classWithExtendedSnackbar)

0

I에서

public void setAction(CharSequence text, final View.OnClickListener ocl) { 
    snackbar.setAction(text, ocl); 
} 

지금 OnClickListener 안에 당신이 호출 할 수 방법 귀하의 질문에 대해 명확하지 않습니다. 그러나, 당신이 모든 메시지를 표시 할 커스텀 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(); 
} 
관련 문제