2012-05-26 33 views
40

Estoy tratando de mostrar un mensaje de brindis cuando el usuario hace clic en un botón dentro de un fragmento. El problema es que no puedo acceder a la actividad para mostrar el Toast en ella.Usar tostadas dentro del fragmento

Aquí está la fuente de 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; 
     } 

y esto es lo que he estado intentado.

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

En depuración puedo ver que todos estos códigos funcionan sin ninguna excepción, pero se muestra ninguna TOAST.

Respuesta

91

No llama al show() en el Toast que está creando con makeText().

+21

Este pequeño ** 'SHOW' ** toma más de 3 horas de mí. Gracias, ahora todo parece hermoso. – mammadalius

+5

Ese es mi error estándar: una buena noticia es que Lint detecta este error a partir del SDK20. –

+0

Me estúpido ... Los gatos fueron mi error ... no llamé a show() – John

17

para ayudar a otra gente con mi mismo problema, la respuesta completa a utilizar pan tostado en el interior fragmento es:

Activity activity = getActivity(); 

@Override 
public void onClick(View arg0) { 

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

Como señaló alfo888_ibg:

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

Just Do:

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

esto funcionó para mí.

0

user2564789 dijo que la derecha
Pero también se puede utilizar this en el lugar de getActivity()
que harán de su tostada este aspecto


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

10

Al hacer un brindis en el fragmento de hacer lo siguiente:

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

Cuando la clase se está extendiendo fragmento es necesario utilizar getAc tivity() ya que el fragmento es una subclase de actividad.

Cheerse

+3

Fragmento es una subclase de Objeto, consulte http://developer.android.com/reference/android/app/Fragment.html, si fuera una subclase de actividad, podría usar 'this' en su lugar – chairam

1

Al llamar pan tostado en el interior fragmento de android:

1. Activity mActivity=this.getActivity(); 

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

Esto funciona para mí.

+0

ya que podemos ver que el usuario sí lo hizo no llame al método 'show()' después del cierre de 'Toast'. simple, puedes comentar esto. –

-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

hacen una tostada en el interior Fragmento

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

O

Activity activityObj = this.getActivity(); 

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

O

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

Usted puede obtener la actividad actual con getActivity()

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

Hola He visto algunos usuarios que ya han sido respondidos. Aún así, creo que esta información puede ser útil para los programadores de Android.

Nunca use getActivity() o getContext() en su respuesta API. Porque puede ser null en algún momento si su fragmento se reemplaza antes de que llegue la respuesta de API.

y error proviene

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

usar en su lugar una clase de aplicaciones para mostrar tostadas. como

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(); 
    } 

} 

Si necesita Activity instance en el fragmento a continuación, puede hacer una base class y ampliarlo con sus todos los fragmentos.

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; 
     } 
    } 

y utilizar en lugar de getBaseProject()getActivity(). Porque nunca le dará null.

Cuestiones relacionadas