[那些年踩过的坑]Android5.0 新控件的一些注意点(持续更新

主题:

1、设置状态栏透明:

style.xml主题中设置

<item name="android:windowTranslucentStatus">true</item> //透明的状态栏
<item name="android:windowTranslucentNavigation">true</item>//透明的导航图
<item name="android:fitsSystemWindows">true</item>//设置应用布局时是否考虑系统窗口布局

用代码设置:

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //判断,如果当前设备android版本大于或等于api4.4,就将status bar设置为透明的
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = getWindow();
            // Translucent status bar
            window.setFlags(
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
        //这里其实可以通过values-v19 的sytle.xml里设置windowTranslucentStatus
        //属性为true来进行设置,但是在某些手机会不起效,所以采用代码的形式进行设置
    }
}


注意如果布局中存在toolbar,使用代码设置会让toolbar跑到状态栏底下去。

需要在toolbar的父控件中设置一个属性:

android:fitsSystemWindows="true"


使用CoordinatorLayout+AppBarLayout+Toolbar+TabLayout+ViewPager布局的注意事项:

1、viewpager内容显示不全(一部分内容跑到AppBarLayout底下去了):

app:layout_behavior="@string/appbar_scrolling_view_behavior"
将这个属性设置在viewpager中,其表示viewpager始终在AppBarLayout下面。

2、在使用CoordinatorLayout+AppBarLayout实现Toolbar上拉隐藏

1、一定要在tablayout中设置以下属性:

app:layout_scrollFlags="scroll|enterAlways"
scroll 表示向下滚动时,这个View会被滚出屏幕范围直到隐藏.
enterAlways 表示向上滚动时,这个View会随着滚动手势出现,直到恢复原来的位置.


2、如果是在CoodinatorLayout外面再套了一层DrawerLayout,出现toolbar隐藏失效。

只需要在CoodinatorLayout外层包裹一层LinearLayout,然后将

android:fitsSystemWindows="true"
写在LinearLayuot中即可。


DrawerLayout:

1、关于DrawerLayout中的按钮点击事件无效:

是因为给左侧菜单布局的时候,左侧菜单的FrameLayout写在了主要内容LinearLayout之前,只要调整下布局就好了。

正确的布局,

<android.support.v4.widget.DrawerLayout
    android:id="@+id/home_drawerlayout"
    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:layout_height="match_parent"
    tools:context=".activity.HomeActivity">

    <!--主要内容-->
    <LinearLayout
        android:fitsSystemWindows="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        
    </LinearLayout>

    <!--左侧菜单-->
    <FrameLayout
        android:id="@+id/home_fl_leftmenu"
        android:layout_width="280dp"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:background="@color/bili_color_white">
    </FrameLayout>

</android.support.v4.widget.DrawerLayout>

SwipeRefreshLayout:

1、下拉刷新圆圈不转。

正确代码:

swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                swipeRefreshLayout.setRefreshing(false);
                Toast.makeText(Test1Activity.this, "刷新成功", Toast.LENGTH_SHORT).show();
            }
        }, 2000);
    }
});


RcyclerView:

1、一个界面显示瀑布流+GridView+ListView的样式:


关键代码:

/**
 * Created by Administrator on 2016/1/8 20:46.
 */
public class TestAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


    private static final int TYPE_LIST      = 0;
    private static final int TYPE_STAGGERED = 1;
    private static final int TYPE_HEADER    = 2;
    private static final int TYPE_INFO      = 3;


    List<Integer> mHeight;
    List<String>  mDatas;
    public Context mContext;

    public TestAdapter(List<String> datas) {
        this.mDatas = datas;

        mHeight = new ArrayList<>();
        for (int i = 0; i < mDatas.size(); i++) {
            mHeight.add((int) (100 + Math.random() * 300));
        }
    }

    @Override
    public int getItemViewType(int position) {
        //前半部分是list,后半部分是瀑布流
        if (position == 0) {
            return TYPE_HEADER;
        } else if (position == 2 || position == 3 || position == 5 || position == 6) {
            return TYPE_INFO;
        } else if (position < 8) {
            return TYPE_LIST;
        }
        return TYPE_STAGGERED;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();
        if (viewType == TYPE_LIST) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.item1, parent, false);
            StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
            layoutParams.setFullSpan(true);
            view.setLayoutParams(layoutParams);
            return TestViewHolder1.newInstance(view);
        } else if (viewType == TYPE_STAGGERED) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.item1, parent, false);
            StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
            layoutParams.setFullSpan(false);
            view.setLayoutParams(layoutParams);
            return TestViewHolder1.newInstance(view);
        } else if (viewType == TYPE_HEADER) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.item_header, parent, false);
            StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
            layoutParams.setFullSpan(true);
            view.setLayoutParams(layoutParams);
            return HeaderHolder.newInstance(mContext, view);
        } else if (viewType == TYPE_INFO) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.item_info, parent, false);
            StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
            layoutParams.setFullSpan(true);
            view.setLayoutParams(layoutParams);
            return InfoViewHolder.newInstance(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        int viewType = getItemViewType(position);
        if (viewType == TYPE_LIST) {
            //要减去header的1
            position = position - 1;
            TestViewHolder1 testViewholder = (TestViewHolder1) holder;
            testViewholder.loadData(mDatas.get(position));
        } else if (viewType == TYPE_STAGGERED) {
            //要减去header的1
            position = position - 1;
            TestViewHolder1 testViewholder = (TestViewHolder1) holder;
            ViewGroup.LayoutParams layoutParams = testViewholder.cardView.getLayoutParams();
            layoutParams.height = mHeight.get(position);
            testViewholder.cardView.setLayoutParams(layoutParams);
            testViewholder.loadData(mDatas.get(position));
        } else if (viewType == TYPE_HEADER) {
            HeaderHolder headerHolder = (HeaderHolder) holder;
            headerHolder.loadData();
        } else if (viewType == TYPE_INFO) {

        }
    }

    @Override
    public int getItemCount() {
        // +1(header)
        return mDatas.size() + 1;
    }
}

2、RecyclerView没有给item提供点击事件,需要自己添加监听器。

3、RcyclerView中item显示不全(如下图):


这个问题害我找了好久啊,最后居然是因为inflate的方式不对。

如果给条目inflate的时候没有指定父容器(recyclerview),就会显示一点点。至于为什么会这样,还有待探究。。

LayoutInflater.from(UIUtils.getContext()).inflate(R.layout.item_test_1, parent,false);
//LayoutInflater.from(UIUtils.getContext()).inflate(R.layout.item_test_1, null);





android:fitsSystemWindows="true"
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值