2016-06-17 2 views
1

divider設定のダイアログフラグメントで拡張可能リストビューを拡張したときにアプリがクラッシュする理由を理解できません。 Android 6.0でのみ発生します。 Android 4.2では問題ありません。ダイアログフラグメントのandroid:expandable listビューのdivider属性がAndroid 6.01で私のアプリケーションをクラッシュさせます

expandablelistview.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout android:id="@+id/filter_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@+id/scroll_layout" 
    android:background="#fff" 
    android:orientation="vertical" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <ExpandableListView 
     android:id="@+id/expandable_list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:divider="@color/primaryLight" 
     android:dividerHeight="5dp"/> 
</LinearLayout> 

パート:

@Override 
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) { 

    if(savedInstanceState == null) { 

     final Context context = getActivity(); 

     Bundle bundle = getArguments(); 

     Map<String, List<FilterItem>> listCollection = (Map<String, List<FilterItem>>) bundle.getSerializable(DATA); 

     List<String> groupList = (List<String>) bundle.getSerializable(GROUP); 

     ExpandableListView expListView = (ExpandableListView) view.findViewById(R.id.expandable_list); 

     final ExpandableListAdapter expListAdapter = new ExpandableListAdapter(context, groupList, listCollection); 

     expListView.setAdapter(expListAdapter); 

     expListView.expandGroup(0); 

    } 
} 

は私がクラッシュがXMLで分周器の設定によって引き起こされていると思います。エラーの一部がsetBounds(android.graphics.Rect)で失敗したことを言うので、私はそれが分周器とは何かを持っていると思います:

android:divider="@color/primaryLight" 
android:dividerHeight="5dp" 

ダイアログフラグメントはこの2行が削除された場合に開くことができます。

ログ:あなたが上ExpandableListViewあなたのコードのクラッシュのソースコードを見ることができるように

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.drawable.Drawable.setBounds(android.graphics.Rect)' on a null object reference 
at android.widget.ExpandableListView.drawDivider(ExpandableListView.java:534) 
at android.widget.ListView.dispatchDraw(ListView.java:3335) 
at android.widget.ExpandableListView.dispatchDraw(ExpandableListView.java:351) 
at android.view.View.draw(View.java:16187) 
at android.widget.AbsListView.draw(AbsListView.java:4166) 
at android.view.View.updateDisplayListIfDirty(View.java:15180) 
at android.view.View.draw(View.java:15954) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
at android.view.View.draw(View.java:16187) 
at android.view.View.updateDisplayListIfDirty(View.java:15180) 
at android.view.View.draw(View.java:15954) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
at android.view.View.updateDisplayListIfDirty(View.java:15175) 
at android.view.View.draw(View.java:15954) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
at android.view.View.updateDisplayListIfDirty(View.java:15175) 
at android.view.View.draw(View.java:15954) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
at android.view.View.draw(View.java:16187) 
at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690) 
at android.view.View.updateDisplayListIfDirty(View.java:15180) 
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281) 
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287) 
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322) 
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2623) 
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2442) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2075) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6023) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
at android.view.Choreographer.doFrame(Choreographer.java:606) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5422) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

答えて

4

@Override 
    void drawDivider(Canvas canvas, Rect bounds, int childIndex) { 
     int flatListPosition = childIndex + mFirstPosition; 

     // Only proceed as possible child if the divider isn't above all items (if it is above 
     // all items, then the item below it has to be a group) 
     if (flatListPosition >= 0) { 
      final int adjustedPosition = getFlatPositionForConnector(flatListPosition); 
      PositionMetadata pos = mConnector.getUnflattenedPos(adjustedPosition); 
      // If this item is a child, or it is a non-empty group that is expanded 
      if ((pos.position.type == ExpandableListPosition.CHILD) || (pos.isExpanded() && 
        pos.groupMetadata.lastChildFlPos != pos.groupMetadata.flPos)) { 
       // These are the cases where we draw the child divider 
       final Drawable divider = mChildDivider; 
       divider.setBounds(bounds); 
       divider.draw(canvas); 
       pos.recycle(); 
       return; 
      } 
      pos.recycle(); 
     } 

     // Otherwise draw the default divider 
     super.drawDivider(canvas, bounds, flatListPosition); 
    } 

dividerがnullの場合、またはmChildDividerがnullの場合、

ので、あなたのコードがクラッシュしてきました

mChildDivder双方向で値を受け入れる:

経由してXMLから

の1-:コードを経由して

android:childDivider="..." 

2 - ::

a.getDrawable(com.android.internal.R.styleable.ExpandableListView_childDivider); 

ので、あなたが設定することができ

public void setChildDivider(Drawable childDivider) { 
     mChildDivider = childDivider; 
    } 

あなたがmChildDividerを設定するには、これらののいずれかを使用する必要があります。

関連する問題