2013-05-02 21 views
6

mam tej metody statycznej:findViewById wewnątrz Metoda statyczna

public static void displayLevelUp(int level, Context context) { 

    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View layout = inflater.inflate(R.layout.custom_level_coast, 
      (ViewGroup) findViewById(R.id.toast_layout_root)); // this row 

    TextView text = (TextView) layout.findViewById(R.id.toastText); 
    text.setText("This is a custom toast"); 

    Toast toast = new Toast(context); 
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
    toast.setDuration(Toast.LENGTH_LONG); 
    toast.setView(layout); 
    toast.show(); 

    Toast.makeText(context, String.valueOf(level), Toast.LENGTH_SHORT) 
      .show(); 

} 

Jednak nie mogę dowiedzieć się, jak zdobyć pierwszy findViewById grać ładny z tego, jak to mówi, że jest to metoda niestatyczny . Rozumiem, dlaczego tak jest napisane, ale musi istnieć obejście? W tej metodzie przekazałem context, ale nie mogłem ich rozwiązać razem.

+2

Nie trzeba przekazywać obiektu kontekstowego, ale obiektu widoku. Ten, który trzyma twoje poglądy – edoardotognoni

+1

Dlaczego po prostu zmienić widok na zmienną klasy i uzyskać do niego dostęp? – tyczj

+0

@Wamasa To jest odpowiednia odpowiedź .. napisz – Pragnani

Odpowiedz

6

Jedną z rzeczy, które można zrobić, jest uczynienie widoku zmienną klasy i użycie jej. Właściwie to nie polecam, ale będzie działać, jeśli potrzebujesz czegoś szybkiego i brudnego.

Przekazywanie widoku jako parametru byłoby preferowanym sposobem.

+0

Dzięki, nie mogę uwierzyć, że o tym nie myślałem. – KickingLettuce

2

To trochę dziwne. Ale możesz przekazać widok główny jako parametr.

//some method... 
ViewGroup root = (ViewGroup) findViewById(R.id.toast_layout_root); 
displayLevelUp(level, context, root); 
//some method end... 


public void displayLevelUp(int level, Context context, ViewGroup root) { 

LayoutInflater inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

View layout = inflater.inflate(R.layout.custom_level_coast, 
     root); 

TextView text = (TextView) layout.findViewById(R.id.toastText); 
text.setText("This is a custom toast"); 

Toast toast = new Toast(context); 
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
toast.setDuration(Toast.LENGTH_LONG); 
toast.setView(layout); 
toast.show(); 

Toast.makeText(context, String.valueOf(level), Toast.LENGTH_SHORT) 
     .show(); 

} 
1

Jeśli chcesz trzymać się użyć metody statycznej Aktywny zamiast kontekście jako parametr i zrobić activity.findViewById tak:

public static void displayLevelUp(int level, Activity activity) { 
    LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View layout = inflater.inflate(R.layout.toastText, (ViewGroup) activity.findViewById(R.id.abs__action_bar_container)); // this row 

Innym sposobem na to jest, aby zdać ViewGroup nadrzędnego jako parametr zamiast kontekstu lub działania:

public static void displayLevelUp(int level, ViewGroup rootLayout) { 
    View layout = rootLayout.inflate(rootLayout.getContext(), R.layout.custom_level_coast, rootLayout.findViewById(R.id.toast_layout_root)); // this row