首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NullPointerException与AppCompat BottomSheets

NullPointerException与AppCompat BottomSheets
EN

Stack Overflow用户
提问于 2016-03-10 01:47:30
回答 5查看 9K关注 0票数 15
代码语言:javascript
运行
复制
LinearLayout bottomSheetViewgroup = (LinearLayout) findViewById(R.id.bottomSheet);

bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetViewgroup);

bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); //this line

在我的活动的onCreate()方法中有以下代码,在执行最后一行时,我将得到下面的NPE异常:

由: java.lang.NullPointerException:尝试在android.support.design.widget.BottomSheetBehavior.setState(BottomSheetBehavior.java:440)上的空对象引用上调用虚拟方法'java.lang.Object java.lang.ref.WeakReference.get()‘引起的

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-03-15 01:34:18

虽然Sanf0rds答案是正确的,但它不允许默认情况下将BottomSheet定义为扩展。该问题是由直到最后一行WeakReference才设置的onLayoutChild引起的。

解决方案是提供我们自己的类来扩展BottomSheetBehavior,但是在覆盖的onLayoutChild中设置状态。代码如下所示。

uk/ac/qub/quibe/misc/ExpandedBottomSheetBehavior.java

代码语言:javascript
运行
复制
package uk.ac.qub.quibe.misc;

import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by mcp on 15/03/16.
 */
public class ExpandedBottomSheetBehavior<V extends View> extends android.support.design.widget.BottomSheetBehavior<V> {

    public ExpandedBottomSheetBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onLayoutChild(final CoordinatorLayout parent, final V child, final int layoutDirection) {
        SavedState dummySavedState = new SavedState(super.onSaveInstanceState(parent, child), STATE_EXPANDED);
        super.onRestoreInstanceState(parent, child, dummySavedState);
        return super.onLayoutChild(parent, child, layoutDirection);
        /*
            Unfortunately its not good enough to just call setState(STATE_EXPANDED); after super.onLayoutChild
            The reason is that an animation plays after calling setState. This can cause some graphical issues with other layouts
            Instead we need to use setInternalState, however this is a private method.
            The trick is to utilise onRestoreInstance to call setInternalState immediately and indirectly
         */
    }

}

在布局文件引用中引用新的自定义行为。

变化

代码语言:javascript
运行
复制
app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

代码语言:javascript
运行
复制
app:layout_behavior="uk.ac.qub.quibe.misc.ExpandedBottomSheetBehavior"
票数 14
EN

Stack Overflow用户

发布于 2018-05-25 06:56:48

代码语言:javascript
运行
复制
public class ExpandedBottomSheetBehavior<V extends View> extends
    android.support.design.widget.BottomSheetBehavior<V> {

  public ExpandedBottomSheetBehavior(Context context, AttributeSet attrs) {
    super(context, attrs);
}

  @Override
  public boolean onLayoutChild(final CoordinatorLayout parent, final V child, final int layoutDirection) {
    return super.onLayoutChild(parent, child, layoutDirection);
  }

  @Override
  public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
    try {
      return super.onInterceptTouchEvent(parent, child, event);
    } catch (NullPointerException ignored) {
      return false;
    }
  }
}
票数 4
EN

Stack Overflow用户

发布于 2016-03-26 14:57:48

代码的问题是,您试图直接在setState中调用onCreate方法。这将引发一个nullPointer,因为WeakReference尚未初始化。当协调员布局即将放置其子视图时,它将被初始化。

onLayoutChild(CoordinatorLayout parent,V子,int layoutDirection) 当父CoordinatorLayout与布局给定的子视图有关时调用。

因此,最好的方法是将peek高度设置为0,并在onItemClick侦听器中显示/隐藏。

我在这里回答了这个问题:https://stackoverflow.com/a/36236743/1314796

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35906125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档