android - studio - Snackbar no está funcionando dentro de la clase de fragmento
snackbar android (3)
He resuelto esto:
Está bien si no incluimos CoordinatedLayout
en mi fragment_home.xml
Solución:
Definido: RelativeLayout privado mRoot;
Ahora inicializar en initUI(View view)
mRoot = (RelativeLayout) view.findViewById(R.id.mainrl);
y en el evento Click del botón, coloque el siguiente código:
Snackbar.make(mRoot, "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
Ahora, lo principal de esto es:
simplemente cambie el tema actual a Theme.AppCompat.Light.NoActionBar
Está hecho.!!!
Intento mostrar la vista de la barra de aperitivos cuando hago clic en el botón, pero muestra un error de cierre de fuerza cuando hago clic en el botón
Tengo definir la clase de fragmento a continuación y también el registro de errores.
Tengo clase de fragmento:
public class HomeFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
context = getActivity();
initUI(rootView);
return rootView;
}
private void initUI(View view) {
btn= (Button) view.findViewById(R.id.btnpress);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(getView(),"SnackBAr Test" , Snackbar.LENGTH_LONG).show();
}
});
}
fragment_home.xml :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/mainrl"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:orientation="horizontal"
android:paddingBottom="40dp" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:Text="PLEASE PRESS" />
</LinearLayout>
</RelativeLayout>
Cuando presiono el botón, no se muestra la snackbar
. da el siguiente registro de error:
java.lang.NoClassDefFoundError: android.support.design.widget.CoordinatorLayout
at android.support.design.widget.Snackbar.findSuitableParent(Snackbar.java:237)
at android.support.design.widget.Snackbar.make(Snackbar.java:206)
at com.example.test.fragment.HomeFragment$3.onLeftCardExit(HomeFragment.java:168)
at android.view.ViewPropertyAnimator$AnimatorEventListener.onAnimationEnd(ViewPropertyAnimator.java:1030)
at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1056)
at android.animation.ValueAnimator.access$400(ValueAnimator.java:50)
at android.animation.ValueAnimator$AnimationHandler.doAnimationFrame(ValueAnimator.java:644)
at android.animation.ValueAnimator$AnimationHandler.run(ValueAnimator.java:660)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788)
at android.view.Choreographer.doCallbacks(Choreographer.java:591)
at android.view.Choreographer.doFrame(Choreographer.java:559)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5333)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
at dalvik.system.NativeStart.main(Native Method)
¿Cómo puedo resolver este error?
SnackBar make
method toma una vista y desde esa vista recorre la jerarquía hasta que encuentra un diseño adecuado para mostrar, si tuvo una excepción, esto significa que no agregó CoordinatedLayout a su proyecto
private static ViewGroup findSuitableParent(View view) {
ViewGroup fallback = null;
do {
if(view instanceof CoordinatorLayout) {
return (ViewGroup)view;
}
if(view instanceof FrameLayout) {
// android.R.id.content
if(view.getId() == 16908290) {
return (ViewGroup)view;
}
fallback = (ViewGroup)view;
}
if(view != null) {
ViewParent parent = view.getParent();
view = parent instanceof View?(View)parent:null;
}
} while(view != null);
return fallback;
}
También puedes usar:
getActivity().findViewById(android.R.id.content)
Me gusta esto:
Snackbar.make(getActivity().findViewById(android.R.id.content),
"Look at me, I''m a fancy snackbar", Snackbar.LENGTH_LONG).show();
Mira this