项目开发的总结很多,没有办法一个一个分类进行总结,在这里只是把自己的一些随心笔记整理出来。
布局中 wight的属性计算公式:
控件的width(计算结果)=控件的宽度(本身的宽度值)+剩余空间的宽度*weight比例值。
ImagView的BackGroud与Src属性区别:
A、区别就是Src会被当做内容(所以会被Padding有影响),而BackGround不会,只是当做背景。
B、Src会根据图片内容进行包含,而BackGround会根据ImagView的宽度进行填充(拉伸).
动态加载一个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);
代码中获取的View的高度、宽度、屏幕的宽高等单位都是px(像素), 比如获取一个dimen为30sp的文字大小,在代码中访问就是30px,然后如果直接设置30px就会造成与实际不符。解决方案:将30px转换成30sp设置即可。
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()区别?当时给自己留下了这个问题,明天再来解答。
关于自定义属性在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"
ScrollTo(int x,int y)和ScrollBy(int x,int y)的区别
A.以控件的左上角为坐标原点,和笛卡尔的坐标系相反方向的坐标系为坐标系,进行滑动
B.ScrollTo滑动的是绝对位置,ScrollBy滑动的是相对位置(增量)
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)方法进行取消任务。
}
})
ListView让ItemView的子View获取焦点
默认情况下ListView的ItemView是会将焦点给获取到的,如果需要ItemView的子view获取焦点需要设置
A.setItemsCanFocus(true),
B.同时ItemView需要设置可以点击:其实原理也很简单就是让ItemView的子view获取焦点就OK了。
android:focusableInTouchMode="true"
android:focusable="true"
解决问题: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()],同时计算页数。
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);
在这里面进行获取高度和宽度。
}
.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;
}
开发一个项目总结的东西很多,后面我会一一的整理一下,预防下次遇到问题不知道怎么做,如有什么问题请大家指正谢谢!!