1、啟動白屏褒脯、黑屏
給啟動頁設(shè)置Theme便瑟,看起來就像秒啟動了。
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowFullscreen">true</item>
<item name="android:windowBackground">@mipmap/splash</item>
</style>
一般啟動頁也就一張圖片憨颠,直接設(shè)置了android:windowBackground就可以胳徽,imageview都不用了积锅。
2爽彤、ViewStub
A ViewStub is an invisible, zero-sized View that can be used to lazily inflate layout resources at runtime.
比如加載列表空布局、引導(dǎo)提示等缚陷。
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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="com.wangsz.myapplication.MainActivity">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Toggle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
<ViewStub
android:id="@+id/viewstub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inflatedId="@+id/viewstub_layout"
android:layout="@layout/viewstub_layout" />
</android.support.constraint.ConstraintLayout>
android:layout="@layout/viewstub_layout" ---ViewStub本身被替換掉的布局文件适篙,調(diào)用viewStub.inflate()。
android:inflatedId="@+id/viewstub_layout" ---ViewStub被提替換之后的布局的id
替換之后的布局的長寬還是以viewstub的屬性為準:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- viewstub本身的setVisibility方法箫爷,在調(diào)用的時候會判斷是否inflate()嚷节,如果是第一次,則會設(shè)置viewstub本身的visibility虎锚,并且調(diào)用inflate()硫痰,當再次調(diào)用setVisibility方法的時候,只會設(shè)置替換之后的view的visibility窜护,所以viewstub的getVisibility()只會等于第一次設(shè)置之后的visibility效斑。
/**
* When visibility is set to {@link #VISIBLE} or {@link #INVISIBLE},
* {@link #inflate()} is invoked and this StubbedView is replaced in its parent
* by the inflated layout resource. After that calls to this function are passed
* through to the inflated view.
*
* @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}.
*
* @see #inflate()
*/
@Override
@android.view.RemotableViewMethod
public void setVisibility(int visibility) {
if (mInflatedViewRef != null) {
View view = mInflatedViewRef.get();
if (view != null) {
view.setVisibility(visibility);
} else {
throw new IllegalStateException("setVisibility called on un-referenced view");
}
} else {
super.setVisibility(visibility);
if (visibility == VISIBLE || visibility == INVISIBLE) {
inflate();
}
}
}
這段代碼,viewStub指向的layout會在第一次點擊textView的時候顯示柱徙,然后之后的所有點擊都是消失缓屠,因為一開始viewStub.getVisibility() == View.GONE,第一次調(diào)用的viewStub.setVisibility(View.VISIBLE);之后viewStub.getVisibility()的值就一直等于View.VISIBLE护侮,調(diào)用viewStub.setVisibility(View.INVISIBLE)只會控制指向的layout的顯示敌完,不會改變viewStub的屬性。
- java.lang.IllegalStateException: ViewStub must have a non-null ViewGroup viewParent
對ViewStub的inflate操作只能進行一次羊初,因為inflate的時候是將其指向的布局文件解析inflate并替換掉當前ViewStub本身(由此體現(xiàn)出了ViewStub“占位符”性質(zhì))滨溉,一旦替換后,此時原來的布局文件中就沒有ViewStub控件了,因此晦攒,如果多次對ViewStub進行infalte禽炬,會出現(xiàn)錯誤信息:ViewStub must have a non-null ViewGroup viewParent。
比如:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textview);
viewStub = (ViewStub) findViewById(R.id.viewstub);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("viewStub",viewStub.getVisibility() + "");
if (viewStub.getVisibility() == View.VISIBLE){
View view = viewStub.inflate();
viewStub.setVisibility(View.INVISIBLE);
} else {
viewStub.setVisibility(View.VISIBLE);
}
}
});
}
第二次點擊textview就會報錯勤家,應(yīng)為第一次調(diào)用viewStub.setVisibility(View.VISIBLE)的時候已經(jīng)調(diào)用過一次inflate()腹尖。