android项目开发总结

项目开发的总结很多,没有办法一个一个分类进行总结,在这里只是把自己的一些随心笔记整理出来。

  1. 布局中 wight的属性计算公式:
    控件的width(计算结果)=控件的宽度(本身的宽度值)+剩余空间的宽度*weight比例值。

  2. ImagView的BackGroud与Src属性区别:
    A、区别就是Src会被当做内容(所以会被Padding有影响),而BackGround不会,只是当做背景。
    B、Src会根据图片内容进行包含,而BackGround会根据ImagView的宽度进行填充(拉伸).

  3. 动态加载一个Layout布局文件成一个View,在XML中最外层View设置的Magin属性会失效,必须在代码中重新设置才行。
    解释:举一个很简单的例子:ListView列表项的布局文件,最外层的View如果设置了margin属性那么将会失效,只有在代码中进行设置才行。具体什么原因还不知道,估计得看源码才知道……

    例如:
    ImageView image = (ImageView) findViewById(R.id.main_image);  
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(image.getLayoutParams());  
    lp.setMargins(50, 100, 0, 0);  
    image.setLayoutParams(lp);  
  4. 9.png图片一条边不能设置两个阴影区域:这个是我自己不小心将.9.png设置了两个阴影区域,导致编译器报错了。
    android项目开发总结_第1张图片

  5. 代码中获取的View的高度、宽度、屏幕的宽高等单位都是px(像素), 比如获取一个dimen为30sp的文字大小,在代码中访问就是30px,然后如果直接设置30px就会造成与实际不符。解决方案:将30px转换成30sp设置即可。

  6. ScollView使用总结:这个在我的博客里面单独做了介绍。
    A、特殊类型的FragmentLayout,只能包含一个子视图或者视图组。
    B、最好不要包含具有滚动效果的组件,滚动效果可能会失效。
    C、直接滚动到底部/顶部:ScollView.fullScroll(ScollView.Focus_Down)
    D、滚动到指定位置:
    ScollView.smoothScrollTo(int x,int y)绝对位置
    ScollView.smoothScrollBy(int x,int y)相对位置(滑动的是增量)
    ScollView的smoothScrollTo与ScrollTo()区别?当时给自己留下了这个问题,明天再来解答。

  7. 关于自定义属性在XML中访问:这个坑遇到了一两次,现在做好记录预防下次犯错。
    A.定义属性:

    <declare-styleable name="MarTextView">
        <attr name="scrollspeed" format="integer"/>
        declare-styleable>

    B.访问:
    名称空间:记得加上名称空间

    xmlns:test="http://schemas.android.com/apk/res-auto"
    访问:test:scrollspeed="50"
  8. ScrollTo(int x,int y)和ScrollBy(int x,int y)的区别
    A.以控件的左上角为坐标原点,和笛卡尔的坐标系相反方向的坐标系为坐标系,进行滑动
    B.ScrollTo滑动的是绝对位置,ScrollBy滑动的是相对位置(增量)

  9. View的post(Runable run)方法和Handler的run方法
    是将run封装成一个Meaasge,然后加入到消息队列中,并在主线程中执行。
    而HandLer的run方法是将Runable封装成Meaasge,然后在Handler所在的线程执行。

    mHandler.post(new Runnable() {
            @Override
            public void run() {
                //在Handler所创建的线程执行。
                ......
                可以通过mHandler.removeCallbacks(runnable)方法进行取消任务。
    
            }
        })
    view.post(new Runnable() {
            @Override
            public void run() {
                //run封装成一个Meaasge,然后加入到消息队列中,并在主线程中执行
                .....
                可以通过view.removeCallbacks(runnable)方法进行取消任务。
            }
        })
  10. ListView让ItemView的子View获取焦点
    默认情况下ListView的ItemView是会将焦点给获取到的,如果需要ItemView的子view获取焦点需要设置
    A.setItemsCanFocus(true),
    B.同时ItemView需要设置可以点击:其实原理也很简单就是让ItemView的子view获取焦点就OK了。

    android:focusableInTouchMode="true" 
    android:focusable="true"
  11. 解决问题:ScrollView包含一个TextView时,滑动过程中可以自动计算页数。
    A.ScollView的特性:一般的ViewGroup在包含子控件的时候,如果子控件的高度大于了父控件的高度,
    那么子控件的测量模式为UNSPECIFIED(不指定子控件高度,要多大就多大,假如超过父控件高度就超过,不做限制。)
    B.ScollView的滑动坐标系:以ScrollView的左上角坐标为原点(0,0),屏幕的横向方向(从左往右)为X轴,屏幕的竖直方向(从上往下)为Y轴。
    C.滑动的理解:可以理解为ScrllView包含的子View不动,ScrollView进行移动。
    D.监听ScrollView的滑动监听:onScrollChanged回调,(API<23时)需要自己继承ScrollView并自定义接口。
    E:通过得到ScrollView包含的子View的总长度来获取ScrollView滑动的区[0,ScollView.getChildAt(0).getHight()-ScollView.getHight()],同时计算页数。

  12. View的测量模式:三种 UNSPECIFIED(不限制) AT_MOST(最大) EXACTLY(精确)
    如何获取View的高度和宽度(三种方式),单位是px.

  方案A. view.post(new Runnable() {
            @Override
            public void run() {
                int hight=view.getHeight();
                int width=view.getWidth();
            }
        });
  方案B.ViewTreeObserver mViewTree=view.getViewTreeObserver();
        mViewTree.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
               int hight=view.getHeight();
                int width=view.getWidth();
                Log.e("onGlobalLayout","hight:"+v.getHeight()+"----"+"width:"+v.getWidth());
            }
        });
   方案C.@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        在这里面进行获取高度和宽度。
        }
  1. .GridView如何设置ItemView不获取焦点,这个和ListView有点区别。
    A.GridView设置属性
    android:descendantFocusability=”afterDescendants”
    属性介绍:
    ViewGroup.FOCUS_AFTER_DESCENDANTS:表示GridView的子Item控件优先于GridView获得焦点;
    ViewGroup.FOCUS_BEFORE_DESCENDANTS:表示GridView优先于其子控件获得焦点
    B.GridView的ItemView设置能获取焦点[假如ItemView里面没有能够获取焦点的控件就需要设置]
    android:focusableInTouchMode=”true”
    android:focusable=”true”
    总结:ListView和GridView在焦点上的处理和差异性!
    (1)相同之处:他们都可以让Itemview里面的子控件获取到焦点,只需要在Itemview里面的子控件配置能获取到焦点即可!示例代码如下:

    ListView XML文件配置

      <ListView
                    android:id="@+id/lv_yykm"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:cacheColorHint="@color/transparent"
                    android:descendantFocusability="beforeDescendants"
                    android:divider="@null"
                    android:scrollbars="none">ListView>

    ListView 适配器的ItemViewd的XML文件配置

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/lv_item_ll"
        android:background="@drawable/sel_focus_btn"
        android:clickable="true"
        android:descendantFocusability="blocksDescendants"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:orientation="vertical"
                android:padding="0dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.jzetech.yb_hospital.view.AlwaysMarqueeTextView
            android:id="@+id/lv_item_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:ellipsize="marquee"
            android:gravity="center"
            android:maxWidth="160dp"
            android:marqueeRepeatLimit="marquee_forever"
            android:singleLine="true"
            android:text="121323"
            android:textColor="@android:color/white"
            android:textSize="@dimen/text_size_middle" />
    RelativeLayout>
LinearLayout>
注意:1.如果设置背景的selector的是.9.png图片的话需要设置ListView的ItemView的XML文件android:padding="0dp",不然会将你的内容挤到下面去(这个原因暂时还不知道)
      2.对于给ListView的ItemView背景是一个selector效果,有两种方式:一种是在ListView设置android:listSelector="@drawable/sel_focus_btn",一种就是在ItemView上面设置,如上所示;
       值得说明的是,第一种方式会有问题(会产生你设置的selector默认的背景图片显示不出来,这个问题暂时还不知道是怎么回事),所有建议采用第二种方式!

(2)差异性:
1.ListView可以需要通过调用这个方法才能setItemsCanFocus(true)让ItemView获取到焦点,而GridView没有这个方法。
2.GridView没有这个方法就会导致如果我们把焦点控制在ItemView上面,那么就会导致我们设置setOnItemSelectedListener方法无效的情况,你们可以试试!
综上所述:ListView的功能比GridView的功能大体上差不多,但是在某些细节上还是有差异的!
3.关于ListView的焦点转移问题
陈述场景:事情是这样的,项目(这个是电视机顶盒项目)中需要做一个医院的科室列表,并且需要在这选择列表的时候显示选中效果(就是我们通常所说的selector),
效果也出来,同时对ListView设置了setOnItemSelectedListener,最后就出现了一个问题:ListView的ItemView焦点和ItemView里面的子控件(就是我们的适配器返回的View)焦点不统一。
简单的说就是你看着是选中了某个科室,但是实际上setOnItemSelectedListener并没有响应!这个问题很坑!
14. 如何在代码中获取ListView的ItemView总和高度?

// 动态改变listView的高度
    public int measureListViewHeight(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            return 0;
        }
        int totalHeight = 0;
        int listViewWidth = ScreenUtils.getScreenW()- dip2px(this, 10);//listView在布局时的宽度:这里的10代表是ListView的Padding和Margin的距离
        int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth, View.MeasureSpec.AT_MOST);
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(widthSpec, 0);

            int itemHeight = listItem.getMeasuredHeight();
            totalHeight += itemHeight;
        }
        // 减掉底部分割线的高度
        int historyHeight = totalHeight
                + (listView.getDividerHeight() * listAdapter.getCount() - 1);
        Log.d("Javine", "listViewHeight = " + historyHeight);
        return historyHeight;
    }

总结

开发一个项目总结的东西很多,后面我会一一的整理一下,预防下次遇到问题不知道怎么做,如有什么问题请大家指正谢谢!!

你可能感兴趣的:(Android项目开发总结)