我是靠谱客的博主 精明牛排,这篇文章主要介绍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设置了两个阴影区域,导致编译器报错了。
    这里写图片描述

  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项目开发总结的全部内容,更多相关android项目开发总结内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(98)

评论列表共有 0 条评论

立即
投稿
返回
顶部