2011-08-11 13 views
20

Utworzyłem niestandardowy motyw dla moich działań, z których wszyscy korzystają. W temacie ustawiam android: background, a to powoduje, że jakikolwiek dialog lub wiadomość toast wyglądają bardzo dziwnie.Zmiana tła tostów w celu dopasowania motywu aktywności

Jak zapobiec temu, aby toast i inne okna dialogowe absorbowały właściwości motywu?

Odpowiedz

51

Można łatwo tworzyć własne tosty z następującego kodu:

Toast toast = Toast.makeText(context, resTxtId, Toast.LENGTH_LONG); 
View view = toast.getView(); 
view.setBackgroundResource(R.drawable.custom_bkg); 
TextView text = (TextView) view.findViewById(android.R.id.message); 
/*here you can do anything with text*/ 
toast.show(); 

Albo można instancji zupełnie niestandardowy tosty:

Toast toast = new Toast(context); 
toast.setDuration(Toast.LENGTH_LONG); 

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View view = inflater.inflate(R.layout.custom_layout, null); 
toast.setView(view); 
toast.show(); 

Dialog dostosowywania jest bardziej złożona rutyna. Ale istnieje podobne obejście.

+3

Javacadabra odpowiedź jest lepszy moim zdaniem – rubdottocom

+1

Am I czytanie kwestia źle? Ale pytanie brzmi, jak ZAPOBIEGAĆ, aby nie był dostosowywany, i stwierdzasz, JAK dostosować go? – WORMSS

+0

@WORRMS, masz rację, ale ... Jeśli chodzi o temat, to toast, który nie ma zastosowania do tego tematu, jest niestandardowym toastem (ponieważ musimy "przebudować" go ponownie) – Dmitry

4

Oto pełny przykład, który zostanie użyty do spersonalizowanej toastu w różnych działaniach.

displayToast

// display customized Toast message 
    public static int SHORT_TOAST = 0; 
    public static int LONG_TOAST = 1; 
    public static void displayToast(Context caller, String toastMsg, int toastType){ 

     try {// try-catch to avoid stupid app crashes 
      LayoutInflater inflater = LayoutInflater.from(caller); 

      View mainLayout = inflater.inflate(R.layout.toast_layout, null); 
      View rootLayout = mainLayout.findViewById(R.id.toast_layout_root); 

      ImageView image = (ImageView) mainLayout.findViewById(R.id.image); 
      image.setImageResource(R.drawable.img_icon_notification); 
      TextView text = (TextView) mainLayout.findViewById(R.id.text); 
      text.setText(toastMsg); 

      Toast toast = new Toast(caller); 
      //toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
      toast.setGravity(Gravity.BOTTOM, 0, 0); 
      if (toastType==SHORT_TOAST)//(isShort) 
       toast.setDuration(Toast.LENGTH_SHORT); 
      else 
       toast.setDuration(Toast.LENGTH_LONG); 
      toast.setView(rootLayout); 
      toast.show(); 
     } 
     catch(Exception ex) {// to avoid stupid app crashes 
      Log.w(TAG, ex.toString()); 
     } 
    } 

i toast_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/toast_layout_root" 
       android:orientation="horizontal" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:padding="10dp" 
       android:background="#DAAA" 
       > 
    <ImageView android:id="@+id/image" 
       android:layout_width="wrap_content" 
       android:layout_height="fill_parent" 
       android:layout_marginRight="10dp" 
       /> 
    <TextView android:id="@+id/text" 
       android:layout_width="wrap_content" 
       android:layout_height="fill_parent" 
       android:textColor="#FFF" 
       /> 
</LinearLayout> 
25

uświadamiam sobie pytanie zostało odebrane, a post jest dość stary na tym etapie. Jednak myślałem, że zostawię odpowiedź dla tych, którzy natrafiają na to pytanie.

wpadłem w kłopoty z tym problemem dzisiaj i tak postanowiłem było wyświetlając moje wiadomości Toast tak:

Toast.makeText(getApplicationContext(), "Checking login details...", Toast.LENGTH_SHORT).show(); 

W przeciwieństwie do tego (zakładając, że wiadomość jest wywoływana z wewnątrz View) :

Toast.makeText(v.getContext(), "Checking login details...", Toast.LENGTH_SHORT).show(); 

To wyjaśniło problemy, które miałem. W każdym razie mam nadzieję, że to pomaga. Oto link do mojego pytania na podobny temat.

Toast background color being changed

+1

super. dzięki!! – OWADVL

+1

świetny komentarz, dziękuję! Przy okazji, pierwsza i zaakceptowana odpowiedź nie zadziałała, ale twoje rozwiązanie tak. – middlehut

+1

Dzięki, miałem to samo pytanie co OP i to działało dla mnie świetnie! – deanresin

Powiązane problemy