如何分隔添加到LinearLayoutICS? [英] How to add dividers to LinearLayoutICS?

查看:389
本文介绍了如何分隔添加到LinearLayoutICS?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想我的切换 二选一应用程序管理器应用 ActionBarSherlock库 的<一个HREF =htt​​p://developer.android.com/tool​​s/support-library/index.html相对=nofollow> 支持库 谷歌已经创建的,因为它变得更更新(ActionBarSherlock不再被开发,链接 此处 ),我认为它应该涵盖了很多的功能。

I'm trying to switch my alternative "App Manager" app from ActionBarSherlock library to the support library Google has created, since it gets more updates (ActionBarSherlock is no longer being developed, link here ) and I think it should cover a lot of functionality.

一切进展顺利(或者看起来是这样),除了命名ICSLinearLayout上ActionBarSherlock我用显示在分隔的一类,即现在被称为LinearLayoutICS。

All went well (or so it seems), except for a class named ICSLinearLayout on ActionBarSherlock I've used to show dividers on, that is now called LinearLayoutICS .

它只是不显示分隔:

请注意:你问之前?你为什么不只是使用一个GridView,<一个href="http://stackoverflow.com/questions/21203951/how-to-handle-gridview-with-cell-of-different-heights">here's的原因,并且还<一href="http://stackoverflow.com/questions/21431097/pinnedheader-google-plus-gridview">this,在情况下,我会永远想添加页眉。

Note: before you ask "why don't you just use a GridView?", here's the reason, and also this, in case I'd ever want to add headers.

在code是差不多的,因为我已经用了ActionBarSherlock:

The code is about the same as I've used for ActionBarSherlock:

rowLayout=new LinearLayoutICS(_context,null);
rowLayout.setMeasureWithLargestChildEnabled(true);
rowLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
rowLayout.setDividerDrawable(_context.getResources().getDrawable(R.drawable.list_divider_holo_dark));
rowLayout.setOrientation(LinearLayout.HORIZONTAL);
... // add views, layout params, etc...

问题

我如何使用这个类,以支持显示在支持库的所有受支持版本的操作系统分隔?

The question

How can I use this class in order to support showing dividers on all supported OS versions of the support library?

什么是错的code我已经写了?

What is wrong with the code I've written?

推荐答案

确定,似乎<一href="http://developer.android.com/reference/android/widget/LinearLayout.html#setShowDividers%28int%29"相对=nofollow> setShowDividers 和<一href="http://developer.android.com/reference/android/widget/LinearLayout.html#setDividerDrawable%28android.graphics.drawable.Drawable%29"相对=nofollow> setDividerDrawable 不能使用,因为LinearLayoutICS没有他们。

OK, it seems setShowDividers and setDividerDrawable cannot be used because LinearLayoutICS doesn't have them .

不仅如此,但皮棉没有提醒我这件事被使用。

Not only that, but Lint didn't warn me about it being used.

所以,我结束了被复制LinearLayoutICS code(从<一个href="https://cells-source.cs.columbia.edu/plugins/gitiles/platform/frameworks/support/+/android-4.3_r1.1/v7/appcompat/src/android/support/v7/internal/widget/LinearLayoutICS.java"相对=nofollow> 此处 ,希望它的最新版本)和一些原始的LinearLayout code,使一些没有工作。我希望这不会有任何错误。

So, what I ended up with is copying LinearLayoutICS code (from here, hope it's the latest version) and some of the original LinearLayout code, to make something that does work. I hope it doesn't have any bugs.

万岁开源...:)

可悲的是<一href="http://developer.android.com/reference/android/widget/LinearLayout.html#setMeasureWithLargestChildEnabled%28boolean%29"相对=nofollow> setMeasureWithLargestChildEnabled 不适用于旧的API,所以我觉得ActionBarSherlock方式仍处于较好的情况下这是你要使用的东西。

Sadly setMeasureWithLargestChildEnabled isn't available for old APIs, so I think the ActionBarSherlock way is still better in case that's something you wish to use.

编辑:在 setMeasureWithLargestChildEnabled 方法不能在ActionBarSherlock工作

the setMeasureWithLargestChildEnabled method doesn't work on ActionBarSherlock.

这里的code,对于那些谁愿意使用。我希望下一次库得到更新,我会记得再次检查这个问题。

Here's the code, for those who wish to use. I hope next time the library gets updated, I will remember to check this issue again.

public class LinearLayoutICS extends LinearLayout
  {
  private Drawable mDivider;
  private int      mDividerWidth,mDividerHeight;
  private int      mShowDividers;
  private int      mDividerPadding;

  public LinearLayoutICS(final Context context,final AttributeSet attrs)
    {
    super(context,attrs);
    // the R is from "android.support.v7.appcompat.R" .
    final TypedArray a=context.obtainStyledAttributes(attrs,R.styleable.LinearLayoutICS);
    mDivider=a.getDrawable(R.styleable.LinearLayoutICS_divider);
    if(mDivider!=null)
      {
      mDividerWidth=mDivider.getIntrinsicWidth();
      mDividerHeight=mDivider.getIntrinsicHeight();
      }
    else mDividerHeight=mDividerWidth=0;
    mShowDividers=a.getInt(R.styleable.LinearLayoutICS_showDividers,SHOW_DIVIDER_NONE);
    mDividerPadding=a.getDimensionPixelSize(R.styleable.LinearLayoutICS_dividerPadding,0);
    a.recycle();
    setWillNotDraw(mDivider==null);
    }

  @Override
  protected void onDraw(final Canvas canvas)
    {
    if(getOrientation()==VERTICAL)
      drawDividersVertical(canvas);
    else drawDividersHorizontal(canvas);
    }

  @Override
  protected void measureChildWithMargins(final View child,final int parentWidthMeasureSpec,final int widthUsed,final int parentHeightMeasureSpec,final int heightUsed)
    {
    if(mDivider!=null)
      {
      final int childIndex=indexOfChild(child);
      final int count=getChildCount();
      final LayoutParams params=(LayoutParams)child.getLayoutParams();
      // To display the dividers in-between the child views, we modify their margins
      // to create space.
      if(getOrientation()==VERTICAL)
        {
        if(hasDividerBeforeChildAt(childIndex))
          params.topMargin=mDividerHeight;
        else if(childIndex==count-1&&hasDividerBeforeChildAt(count))
          params.bottomMargin=mDividerHeight;
        }
      else if(hasDividerBeforeChildAt(childIndex))
        params.leftMargin=mDividerWidth;
      else if(childIndex==count-1&&hasDividerBeforeChildAt(count))
        params.rightMargin=mDividerWidth;
      }
    super.measureChildWithMargins(child,parentWidthMeasureSpec,widthUsed,parentHeightMeasureSpec,heightUsed);
    }

  void drawDividersVertical(final Canvas canvas)
    {
    final int count=getChildCount();
    for(int i=0;i<count;i++)
      {
      final View child=getChildAt(i);
      if(child!=null&&child.getVisibility()!=GONE&&hasDividerBeforeChildAt(i))
        {
        final LayoutParams lp=(LayoutParams)child.getLayoutParams();
        drawHorizontalDivider(canvas,child.getTop()-lp.topMargin);
        }
      }
    if(hasDividerBeforeChildAt(count))
      {
      final View child=getChildAt(count-1);
      int bottom=0;
      if(child==null)
        bottom=getHeight()-getPaddingBottom()-mDividerHeight;
      else bottom=child.getBottom();
      drawHorizontalDivider(canvas,bottom);
      }
    }

  void drawDividersHorizontal(final Canvas canvas)
    {
    final int count=getChildCount();
    for(int i=0;i<count;i++)
      {
      final View child=getChildAt(i);
      if(child!=null&&child.getVisibility()!=GONE&&hasDividerBeforeChildAt(i))
        {
        final LayoutParams lp=(LayoutParams)child.getLayoutParams();
        drawVerticalDivider(canvas,child.getLeft()-lp.leftMargin);
        }
      }
    if(hasDividerBeforeChildAt(count))
      {
      final View child=getChildAt(count-1);
      int right=0;
      if(child==null)
        right=getWidth()-getPaddingRight()-mDividerWidth;
      else right=child.getRight();
      drawVerticalDivider(canvas,right);
      }
    }

  void drawHorizontalDivider(final Canvas canvas,final int top)
    {
    mDivider.setBounds(getPaddingLeft()+mDividerPadding,top,getWidth()-getPaddingRight()-mDividerPadding,top+mDividerHeight);
    mDivider.draw(canvas);
    }

  void drawVerticalDivider(final Canvas canvas,final int left)
    {
    mDivider.setBounds(left,getPaddingTop()+mDividerPadding,left+mDividerWidth,getHeight()-getPaddingBottom()-mDividerPadding);
    mDivider.draw(canvas);
    }

  /**
   * Determines where to position dividers between children.
   *
   * @param childIndex Index of child to check for preceding divider
   * @return true if there should be a divider before the child at childIndex
   * @hide Pending API consideration. Currently only used internally by the system.
   */
  protected boolean hasDividerBeforeChildAt(final int childIndex)
    {
    if(childIndex==0)
      return (mShowDividers&SHOW_DIVIDER_BEGINNING)!=0;
    else if(childIndex==getChildCount())
      return (mShowDividers&SHOW_DIVIDER_END)!=0;
    else if((mShowDividers&SHOW_DIVIDER_MIDDLE)!=0)
      {
      boolean hasVisibleViewBefore=false;
      for(int i=childIndex-1;i>=0;i--)
        if(getChildAt(i).getVisibility()!=GONE)
          {
          hasVisibleViewBefore=true;
          break;
          }
      return hasVisibleViewBefore;
      }
    return false;
    }

  @Override
  public int getDividerPadding()
    {
    return mDividerPadding;
    }

  @Override
  public void setDividerPadding(final int dividerPadding)
    {
    mDividerPadding=dividerPadding;
    }

  @Override
  public void setShowDividers(final int showDividers)
    {
    if(mShowDividers!=showDividers)
      requestLayout();
    mShowDividers=showDividers;
    }

  @Override
  public void setDividerDrawable(final Drawable divider)
    {
    if(divider==mDivider)
      return;
    mDivider=divider;
    if(divider!=null)
      {
      mDividerWidth=divider.getIntrinsicWidth();
      mDividerHeight=divider.getIntrinsicHeight();
      }
    else
      {
      mDividerWidth=0;
      mDividerHeight=0;
      }
    setWillNotDraw(divider==null);
    requestLayout();
    }

  @Override
  public Drawable getDividerDrawable()
    {
    return mDivider;
    }
  }

这篇关于如何分隔添加到LinearLayoutICS?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆