Snackbar 在片段类中不起作用
Posted
技术标签:
【中文标题】Snackbar 在片段类中不起作用【英文标题】:Snackbar is not working within fragment class 【发布时间】:2015-11-25 03:45:06 【问题描述】:我试图在单击按钮时显示 snackbar 视图,但是当我单击按钮时显示强制关闭错误
我在下面定义了片段类以及错误日志。
我有片段类:
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_
android:id="@+id/mainrl"
android:layout_>
<LinearLayout
android:layout_
android:layout_
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:orientation="horizontal"
android:paddingBottom="40dp" >
<Button
android:id="@+id/btn"
android:layout_
android:layout_
android:Text="PLEASE PRESS" />
</LinearLayout>
</RelativeLayout>
当我按下按钮时,它没有显示snackbar
。它给出了以下错误日志:
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)
我该如何解决这个错误?
【问题讨论】:
您是否尝试过通过传递v
而不是getView
作为第一个参数?
什么是 v ?我已经尝试通过 view
而不是 getView
但它不起作用。同样的错误。
意思是onClick(View v)
方法参数
是的,我也试过了,但仍然出现强制关闭错误。
at com.example.test.fragment.HomeFragment$3.onLeftCardExit(HomeFragment.java:168)
请出示此方法代码..
【参考方案1】:
你也可以使用:
getActivity().findViewById(android.R.id.content)
像这样:
Snackbar snackBar = Snackbar.make(getActivity().findViewById(android.R.id.content),
"Look at me, I'm a fancy snackbar", Snackbar.LENGTH_LONG);
snackBar.show();
见this
【讨论】:
天哪!你从巨大的毁灭中拯救了我的整个氏族,最终你的答案有效 @ojonugwaochalifu 我正在使用类似的方法。但这给了我错误。Cannot resolve method getActivity()
为什么?
@Omid1989 在此处添加您正在使用的代码行作为注释
可以在我想显示Snackbar
的任何地方盲目使用吗?因为这个根视图将在所有活动和片段中可用。
对我来说,如果我在一个活动中有一个片段,我可以获得片段的容器视图并且 ir 工作正常。但是,如果我在 tablayout 内的片段中,则无法通过获取片段容器来工作。然后,我必须使用这种方法或获取活动的容器。【参考方案2】:
我已经解决了这个问题:
如果我们不将CoordinatedLayout
包含到我的fragment_home.xml
中也可以
解决方案:
定义: 私有RelativeLayout mRoot;
现在在initUI(View view)
中初始化
mRoot = (RelativeLayout) view.findViewById(R.id.mainrl);
在按钮点击事件上输入以下代码:
Snackbar.make(mRoot, "Had a snack at Snackbar", Snackbar.LENGTH_LONG).show();
现在主要的事情是:
只需将当前主题更改为Theme.AppCompat.Light.NoActionBar
完成了。!!!
【讨论】:
如果这里有其他人没有显示 Snackbar,请检查你在它后面写了.show()
方法!这很愚蠢,但对我来说就是这样
@Nexen 我爱你。是的,这很愚蠢,但我在一个月内发生了两次。
这个解决方案不弹出布局【参考方案3】:
SnackBar make
方法获取一个视图,并从该视图跟踪层次结构,直到找到合适的布局来显示,如果您有异常,这意味着您没有将 CoordinatedLayout 添加到您的项目中
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;
【讨论】:
所以我只需要把这段代码写到当前的片段类中? 如果我不想添加协调布局怎么办? 不,这是内置在 SnackBar 中的,您可能没有在依赖项中添加任何内容 @deepak,如果你想使用Android的snackbar,你也必须添加所有相关的东西 我在我的代码中添加了android-support-design.JAR
。【参考方案4】:
对于 Kotlin 语言,您必须使用:
requireActivity().findViewById(R.id.context_id)
例如:
Snackbar.make(
requireActivity().findViewById(R.id.context_id),
getString(R.string.something_went_wrong),
Snackbar.LENGTH_LONG
).show()
【讨论】:
以上是关于Snackbar 在片段类中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
autoHideDuration 在 Snackbar @material-ui 中不起作用
autoHideDuration 在使用钩子的 Snackbar 中不起作用[关闭]