工作的日子总是飞快,虽然对于很多大佬来书我说的这些都只是小问题,不值得一提,但是在遇到的时候不会任然会觉得自己还差的很远,为了不断的进步,也为了不断的总结,特意做此纪录。
1,向上转型和向下转型
答:向上转型的时候不需要使用强转,向下转型的时候必须使用强转且需要使用 instanceof 关键字进行判断是否可以强转才行。
向上转型:子类对象转为父类,父类可以是接口。
公式:Father f = new Son();Father 是父类或接口,son 是子类。
向下转型:父类对象转为子类。公式:Son s = (Son)f;
注意:向上转型不要强制转型。向上转型后父类的引用所指向的属性是父类的属性,如果子类重写了父类的方法,那么父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定。向上转型后父类引用不能调用子类自己的方法,就是父类没有但是子类新添加的方法,如果调用编译不能通过。
2)如果非要调用子类扩展的方法,就只能向下转型了。 必须先向上转型才能在向下转型
向下转型需要考虑安全性,如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现 java.lang.ClassCastException 错误。它可以使用 instanceof 来避免出错此类错误即能否向下转型,只有先经过向上转型的对象才能继续向下转型。
package multistate;
public class Human {
public void sleep() {
System.out.println("Human sleep..");
}
public static void main(String[] args) {
Human h = new Male();// 向上转型
Human h1 = new Human();
//h.speak();此时需要向下转型,否则不能调用speak方法。
Male m = (Male) h;
m.speak();
/**Male m1 = (Male)h1;
m1.speak(); 此时会出现运行时错误,所以可以用instanceOF判断*/
if (h1 instanceof Male){
Male m1 = (Male)h1;
m1.speak();
}
}
}
class Male extends Human {
@Override
public void sleep() {
System.out.println("Male sleep..");
}
public void speak() {
System.out.println("I am Male");
}
}
这个可以说是学习 Java 语言的同学都耳熟能详的知识点了,但是看起来清晰,深究可能反而迷惑。我之所以说这个知识点是因为研发主管让带我的老哥写一套类似 ios 的通用模板,对于新建编辑详情页面合一,这样就不用每个页面都单独写一个类且定义这么多的变量名了。因为需要封装基类,所以在做判断的时候需要用到 向上转型 和 向下转型。我仔细想发现突然不明白为什么能够使用父类的对象访问子类的方法。总之有些困惑,所以才单独做了记录。
2,了解下 tools:text="" 和 android:text="" 有什么区别
安卓开发中,在写布局代码xml的时候,如果想看到运行之后才能看到的布局效果,但又不想动不动就把应用跑起来。就可以用到 tools 这个命名空间了。
tools命名空间比较特别。该命名空间可以覆盖组件的任何属性,以便在 Android Studio 预览中进行不同的展示。既然 TextView 有 text 属性,我们可以为它提供初始值,
在应用运行前就知道它大概的样子。不用担心,应用运行时,所有 tools 打头的属性都会被忽略,上面的文字不会显示出来。
<TextView
android:id="@+id/text_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.Title"
android:layout_margin="@dimen/main_margin"
tools:text="I am a title" />
之所以提到这个属性是因为我最近在研究 MVP 和 Kt,略有所得,找一个老哥要来他的 Demo 看一看借鉴下写法,在他的布局中出现了这个属性。之前没有了解过所以做了记录。
3,关于 ellipsize 属性使用的一些细节
ellipsize主要是处理当文字长度超过TextView可显示的长度的时候,系统的处理方式,ellipsize主要有以下几种值:
android:ellipsize="start" —– 省略号显示在开头 "...789"
android:ellipsize="end" —— 省略号显示在结尾 "123..."
android:ellipsize="middle" —- 省略号显示在中间 "12...89"
android:ellipsize="marquee" – 以横向滚动方式显示 (需获得当前焦点时)
android:ellipsize="none" –-- 不做任何处理 (会将要显示的文字截断)
根据TextView的这个属性,我们可以在TextView上实现跑马灯效果:
<TextView
android:layout_width="match_parent"
android:layout_height="48dp"
android:ellipsize="marquee"
android:focusable="true"
android:singleLine="true"
android:textColor="#912CEE"
android:textSize="18sp"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:text="国际在线报道:习近平主席此次对英国的访问是中英全面战略伙伴关系步入第二个十年、中欧建交40年之际,对英国进行的首次国事访问。这次访问全面推动了中英关系发展,开启了中英战略伙伴关系黄金时代。英国各界人士尤其是英国网民高度关注并积极评价习近平主席的访英行程。">
</TextView>
4,关于 overScrollMode 的属性使用
desc:该属性是设置滑动到边缘时无效果模式
1)设置滑动到顶部和底部的背景或颜色:
android:overScrollFooter="@android:color/transparent"
android:overScrollHeader="@android:color/transparent"
2)设置滑动到边缘时无效果模式:android:overScrollMode="never"
3)设置滚动条不显示:android:scrollbars="none"
RecyclerView 整体设置
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_search_one"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:scrollbars="none" />
5,imeOptions 属性使用 (对于弹起键盘的确认按钮设置)
1)默认情况下软键盘右下角的按钮为“下一个”,点击会到下一个输入框,保持软键盘
Attention One:
使用android:imeOptions属性的时候,一定要对EditText设置 android:inputType 或者 设置 android:singleline=”true”。
在 activity_main.xml 文件中,定义了8个 EditText,imeOptions 分别是:
actionDone 完成 对应 EditorInfo.IME_ACTION_DONE
actionGo 前进 对应 EditorInfo.IME_ACTION_GO
actionNext 下一项 对应 EditorInfo.IME_ACTION_NEXT
actionNone 无动作 对应 EditorInfo.IME_ACTION_NONE
actionPrevious 上一项 对应 EditorInfo.IME_ACTION_PREVIOUS
actionSearch 搜索 对应 EditorInfo.IME_ACTION_SEARCH
actionUnspecified 未指定 对应 EditorInfo.IME_ACTION_UNSPECIFIED
actionSend 发送 对应 EditorInfo.IME_ACTION_SEND
6,app:errorEnabled="true" 的属性使用
属性 说明
app:Theme 设置下划线或其他的颜色属性
android.support.design:counterEnabled 是否显示计数器
android.support.design:counterMaxLength 设置计数器的最大值,与counterEnabled同时使用
android.support.design:counterTextAppearance 计数器的字体样式
android.support.design:counterOverflowTextAppearance 输入字符大于我们限定个数字符时的字体样式
android.support.design:errorEnabled 是否显示错误信息
android.support.design:errorTextAppearance 错误信息的字体样式
android.support.design:hintAnimationEnabled 是否显示hint的动画,默认true
android.support.design:hintEnabled 是否使用hint属性,默认true
android.support.design:hintTextAppearance 设置hint的文字样式(指运行动画效果之后的样式)
android.support.design:passwordToggleDrawable 设置密码开关Drawable图片,于passwordToggleEnabled同时使用
android.support.design:passwordToggleEnabled 是否显示密码开关图片,需要EditText设置inputType
android.support.design:passwordToggleTint 设置密码开关图片颜色
android.support.design:passwordToggleTintMode 设置密码开关图片(混合颜色模式),与passwordToggleTint同时使用
7,ScrollView 的属性 fillViewport 使用(目的为了 ScrollView 里的 View 无法填充全屏的时候强制充满全屏)
将ScrollView中android:fillViewport设置为true。
当ScrollView里的元素想填满ScrollView时,使用"fill_parent"是不管用的,必需为ScrollView设置:android:fillViewport="true"。
当 ScrollView 没有 fillVeewport=“true” 时,里面的元素(比如 LinearLayout )会按照 wrap_content 来计算(不论它是否设了 "fill_parent" ),而如果 LinearLayout 的元素设置了 fill_parent, 那么也是不管用的,因为 LinearLayout 依赖里面的元素,而里面的元素又依赖 LinearLayout , 这样自相矛盾.所以里面元素设置了 fill_parent,也会当做 wrap_content 来计算。
8,performClick() 使用,调用系统点击事件(模拟用户点击)
desc:该函数的作用就是模拟用户点击了一次事件。即相当于一个 View 被点击了一次。
网友评论