2012-05-26 11 views
40

Próbuję pokazać komunikat Toast, gdy użytkownik kliknie przycisk wewnątrz fragmentu. Problem polega na tym, że nie mogę uzyskać dostępu do działania, aby pokazać toast.Użyj Toast wewnątrz Fragment

Oto źródło Fragment:

public class FrgTimes extends Fragment 
    { 
     ScrollView sv; 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) 
     { 
      if (container == null) { return null; } 

      sv = (ScrollView)inflater.inflate(R.layout.frg_times, container, false); 

      btnTime1.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 

      //****** HERE's the PROBLEM ******** 
      Toast.makeText(<The Activity>, "Please long press the key", Toast.LENGTH_LONG); 

      }}); 

      return sv; 
     } 

A oto co ja próbowałem.

Toast.makeText(getActivity() , ... 
Toast.makeText(getView().getContext() , ... 
Toast.makeText(getActivity().getApplicationContext() , ... 
Toast.makeText(sv.getContext() , ... 
Toast.makeText(sv.getRootView().getContext() , ... 

W Debug widzę, że wszystkie z tych kodów uruchomić bez wyjątku, ale nie TOAST są wyświetlane.

Odpowiedz

91

Nie dzwonisz pod numer show() w Toast, który tworzysz pod numerem makeText().

+21

Ten mały ** 'SHOW' ** zajmuje więcej niż 3 godziny ode mnie. Dzięki, teraz wszystko wydaje się piękne. – mammadalius

+5

To jest mój standardowy błąd - dobrą wiadomością jest to, że Lint wykrywa ten błąd od SDK20. –

+0

Stupid Me .. To był mój błąd. Nie dzwoniłam show() – John

17

Aby pomóc innym ludziom z mojego sam problem, pełna odpowiedź Użyj Toast wewnątrz fragment jest:

Activity activity = getActivity(); 

@Override 
public void onClick(View arg0) { 

    Toast.makeText(activity,"Text!",Toast.LENGTH_SHORT).show(); 
} 
41

Jak stwierdził alfo888_ibg:

@Override 
public void onClick(View arg0) { 
    Toast.makeText(activity,"Text!",Toast.LENGTH_SHORT).show(); 
} 

Wystarczy zrobić:

Toast.makeText(getActivity(),"Text!",Toast.LENGTH_SHORT).show(); 

to działało dla mnie.

0

user2564789 powiedział, że prawo
Ale można też użyć this w miejscu getActivity()
który uczyni Państwa tosty wyglądać następująco


    Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show(); 

10

Dokonując toast fragmentu zrobić w następujący sposób:

Toast.makeText(getActivity(),"Message", Toast.LENGTH_SHORT).show();

Gdy klasa rozszerza fragment, konieczne jest użycie getAc tivity(), ponieważ fragment jest podklasą podtypu aktywności.

Cheerse

+3

Fragment jest podklasą obiektu, sprawdź http://developer.android.com/reference/android/app/Fragment.html, jeśli była to podklasa działania, możesz użyć 'this' zamiast tego – chairam

1

Dzwoniąc Toast wewnątrz android fragmentu:

1. Activity mActivity=this.getActivity(); 

2. Toast.makeText(mActivity,"Text you want to display",Toast.LENGTH_SHORT).show(); 

Działa to dla mnie.

+0

, ponieważ widzimy, że użytkownik nie wywoływać metody 'show()' po zamknięciu 'Toast'. proste, możesz to skomentować. –

-1
 public void onClick(View v) { 
      Context context = v.getContext(); 
      CharSequence text = "Message"; 
      int duration = Toast.LENGTH_SHORT; 
      Toast toast = Toast.makeText(context, text, duration); 
      toast.show(); 
     } 
4

podejmowania toast wewnątrz Fragment

Toast.makeText(getActivity(), "Your Text Here!", Toast.LENGTH_SHORT).show(); 

LUB

Activity activityObj = this.getActivity(); 

    Toast.makeText(activityObj, "Your Text Here!", Toast.LENGTH_SHORT).show(); 

LUB

Toast.makeText(this, "Your Text Here!", Toast.LENGTH_SHORT).show(); 
1

można uzyskać bieżącej działalności z getActivity()

Toast.makeText(getActivity(),"Toast your message" ,Toast.LENGTH_SHORT).show(); 
0

Witam Widziałem, że niektórzy użytkownicy już odpowiedzieli na pytanie. Nadal uważam, że informacje te mogą być przydatne dla programistów Androida.

Nigdy nie używaj getActivity() lub getContext() w odpowiedzi na api. Ponieważ może to być jakiś czas, jeśli twój fragment zostanie zastąpiony, zanim nadejdzie odpowiedź na api.

i błąd pochodzi

java.lang.IllegalStateException: Fragment MyFragment{410f6060} not attached to Activity

Zamiast korzystać z aplikacji, aby pokazać klasę tosty. jak

public class ApplicationContext extends Application { 

/** Instance of the current application. */ 
private static ApplicationContext instance; 

/** 
* Constructor. 
*/ 
public ApplicationContext() { 
    instance = this; 
} 

/** 
* Gets the application context. 
* 
* @return the application context 
*/ 
public static Context getContext() { 
    if (instance == null) { 
     instance = new ApplicationContext(); 
    } 
    return instance; 
} 

/** 
    * display toast message 
    * 
    * @param data 
    */ 
    public static void showToast(String data) { 
     Toast.makeText(getContext(), data, 
       Toast.LENGTH_SHORT).show(); 
    } 

} 

Jeśli potrzebujesz Activity instance w fragment następnie można dokonać base class i przedłużyć go ze swoimi wszystkimi fragmentami.

public class BaseProjectFragment extends Fragment 

    private BaseProject baseProject; 

    public BaseProject getBaseProject() { 
     if (baseProject == null) baseProject = (BaseProject) getBaseProject(); 
     return baseProject; 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof BaseProject) { 
      baseProject = (BaseProject) context; 
     } 
    } 

i używać getBaseProject() zamiast getActivity(). Ponieważ nigdy nie da ci null.

Powiązane problemy