




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】如何使用DataBinding庫來聲明layouts文件
本文在下為大家詳細介紹“如何使用DataBinding庫來聲明layouts文件”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“如何使用DataBinding庫來聲明layouts文件”文章能幫助大家解決疑惑,下面跟著在下的思路慢慢深入,一起來學習新知識吧。1.介紹DataBinding庫不僅靈活而且廣泛兼容-它是一個support庫,因此你可以在所有的Android平臺***能到Android2.1(API等級7+)上使用它。需要:AndroidStudio1.3.0-beta1或更高版本。測試版本請注意:DataBinding庫當前是測試版本。在DataBinding處于測試階段時,開發(fā)者應該了解以下注意事項:這是旨在生成開發(fā)者的反饋功能的測試版本。它可能包含bugs,或者不適合你的使用案例,所以需要您在使用它時自擔風險。即便如此,我們非常希望得到您的反饋!使用issuetracker來讓我們知道對于你的使用案例什么可以工作或者不能工作。DataBinding庫的測試版本傾向于顯著的改變,包括那些不是與您的應用程序兼容的源代碼。即,在未來可能會進行大量的返工來更新此庫。雖然伴有標準AndroidSDK和GooglePlay服務條款適用警告,開發(fā)人員可以隨時發(fā)布內(nèi)置了與DataBinding庫beta版本的應用程序。而且采用新的庫或工具是一個相當好的主意來徹底測試你的應用程序。我們在這個時候才剛剛開始與AndroidStudio的支持。未來會有進一步的AndroidStudio的支持。通過使用DataBinding庫beta版本,你承認這些警告。2.構建環(huán)境要開始使用DataBinding,首先需要在AndroidSDKManager的支持庫里下載該庫。請確保您使用的是AndroidStudio的兼容版本。AndroidStudio的DataBinding插件需要AndroidStudio1.3.0-beta1或更高版本。工作環(huán)境你的app要使用DataBinding,需要添加DataBinding到gradle構建文件里,如下:dependencies
{
classpath
"com.android.tools.build:gradle:1.2.3"
classpath
"com.android.databinding:dataBinder:1.0-rc0"
}
}然后確保jcenter在repositories列表里,如下:allprojects
{
repositories
{
jcenter()
}
}在每一個你想要使用DataBinding的module,添加如下的插件:applyplugin:‘com.android.application'applyplugin:'com.android.databinding'DataBinding插件將會在你的項目內(nèi)添加必需提供的以及編譯配置依賴。3.DataBindingLayout文件DataBinding表達式DataBindinglayout文件有點不同的是:起始根標簽是layout,接下來一個data元素以及一個view的根元素。這個view元素就是你沒有使用DataBinding的layout文件的根元素。舉例說明如下:<?xml
version="1.0"
encoding="utf-8"?>
<layout
xmlns:android="/apk/res/android">
<data>
<variable
name="user"
type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>在data內(nèi)描述了一個名為user的變量屬性,使其可以在這個layout中使用:<variablename="user"type="com.example.User"/>在layout的屬性表達式寫作@{},下面是一個TextView的text設置為user的firstName屬性:<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>Data對象假設你有一個user的plain-oldJavaObject(POJO):public
class
User
{
public
final
String
firstName;
public
final
String
lastName;
public
User(String
firstName,
String
lastName)
{
this.firstName
=
firstName;
this.lastName
=
lastName;
}
}這個類型的對象擁有從不改變的數(shù)據(jù)。在app中它是常見的,可以讀取一次并且之后從不改變。當然也可以使用JavaBeans對象:public
class
User
{
private
final
String
firstName;
private
final
String
lastName;
public
User(String
firstName,
String
lastName)
{
this.firstName
=
firstName;
this.lastName
=
lastName;
}
public
String
getFirstName()
{
return
this.firstName;
}
public
String
getLastName()
{
return
this.lastName;
}
}從DataBinding的角度來看,這兩個類是等價的。用于TextView中的android:text屬性的表達式@{user.firstName}將訪問前者POJO對象中的firstName和后者JavaBeans對象中的getFirstName()方法。Binding數(shù)據(jù)默認情況下,一個Binding類會基于layout文件的名稱而產(chǎn)生,將其轉換為Pascalcase(譯注:首字母大寫的命名規(guī)范)并且添加“Binding”后綴。上述的layout文件是activity_main.xml,因此生成的類名是ActivityMainBinding。此類包含從layout屬性到layout的Views中所有的bindings(例如user變量),并且它還知道如何給Binding表達式分配數(shù)值。創(chuàng)建bindings的最簡單的方式是在inflating(譯注:layout文件與Activity/Fragment的“鏈接”)期間如下:@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
ActivityMainBinding
binding
=
DataBindingUtil.setContentView(this,
R.layout.main_activity);
User
user
=
new
User("Test",
"User");
binding.setUser(user);
}
就是這樣,運行app后,你將會看到Test
User?;蛘吣憧梢酝ㄟ^如下獲取View:
MainActivityBinding
binding
=
MainActivityBinding.inflate(getLayoutInflater());
如果你在ListView或者RecyclerView
adapter使用Data
Binding時,你可能會使用:
ListItemBinding
binding
=
ListItemBinding.inflate(layoutInflater,
viewGroup,
false);
//or
ListItemBinding
binding
=
DataBindingUtil.inflate(layoutInflater,
R.layout.list_item,
viewGroup,
false);4.深入Layout文件Import零個或多個import元素可能在data元素中使用。這些只用在你的layout文件中添加引用,就像在Java中:<data>
<import
type="android.view.View"/>
</data>現(xiàn)在,View可以使用你的Binding表達式:<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{user.isAdult
?
View.VISIBLE
:
View.GONE}"/>當類名有沖突時,其中一個類名可以重命名為alias::<import
type="android.view.View"/>
<import
type="com.example.real.estate.View"
alias="Vista"/>這樣,在該layout文件中Vista對應com.example.real.estate.View,而View對應android.view.View。導入的類型可以在Variable和表達式中使用作為引用來使用:<data>
<import
type="com.example.User"/>
<import
type="java.util.List"/>
<variable
name="user"
type="User"/>
<variable
name="userList"
type="List<User>"/>
</data>注意:AndroidStudio還沒有處理imports,所以自動導入Variable在你的IDE不能使用。您的app仍會正常編譯,你可以在您的Variable定義中使用完全符合規(guī)定的名稱來解決該IDE問題。<TextView
android:text="@{((User)(user.connection)).lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>導入的類型還可以在表達式中使用static屬性和方法:<data>
<import
type="com.example.MyStringUtils"/>
<variable
name="user"
type="com.example.User"/>
</data>
…
<TextView
android:text="@{MyStringUtils.capitalize(user.lastName)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>就像在Java中,java.lang。*是自動導入的。Variables在data中可以使用任意數(shù)量的variable元素。每一個variable元素描述了一個用于layout文件中Binding表達式的屬性。<data>
<import
type="android.graphics.drawable.Drawable"/>
<variable
name="user"
type="com.example.User"/>
<variable
name="image"
type="Drawable"/>
<variable
name="note"
type="String"/>
</data>該Variable類型在編譯時檢查,因此如果一個Variable實現(xiàn)了Observable或observablecollection,這應該反映在類型中。(譯注:需要查找資料來理解)如果variable是一個沒有實現(xiàn)Observable接口的基本類或者接口,Variables不會被observed!當對于多種配置有不同的layout文件時(如,橫向或縱向),Variables會被合并。這些layout文件之間必須不能有沖突的Variable定義。產(chǎn)生的Binding類對于每一個描述的Variables都會有setter和getter。這些Variables會使用默認的Java值-null(引用類型)、0(int)、false(boolean)等等,直到調(diào)用setter時。自定義Binding類名稱默認情況下,Binding類的命名是基于所述layout文件的名稱,用大寫開頭,除去下劃線()以及()后的***個字母大寫,然后添加“Binding”后綴。這個類將被放置在一個模塊封裝包里的databinding封裝包下。例如,所述layout文件contact_item.xml將生成ContactItemBinding。如果模塊包是com.example.my.app,那么它將被放置在com.example.my.app.databinding。Binding類可通過調(diào)整data元素中的class屬性來重命名或放置在不同的包中。例如:<data
class="ContactItem">
...
</data>在模塊封裝包的databinding包中會生成名為ContactItem的Binding類。如果要想讓該類生成在不同的包種,你需要添加前綴.,如下:<data
class=".ContactItem">
...
</data>在這個情況下,ContactItem類直接在模塊包種生成?;蛘吣憧梢蕴峁┱麄€包名:<data
class="com.example.ContactItem">
...
</data>Includes通過使用applicationnamespace以及在屬性中的Variable名字從容器layout中傳遞Variables到一個被包含的layout:<?xml
version="1.0"
encoding="utf-8"?>
<layout
xmlns:android="/apk/res/android"
xmlns:bind="/apk/res-auto">
<data>
<variable
name="user"
type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
layout="@layout/name"
bind:user="@{user}"/>
<include
layout="@layout/contact"
bind:user="@{user}"/>
</LinearLayout>
</layout>注意:在name.xml以及contact.xml兩個layout文件中必需要有uservariable表達式常用表達式跟Java表達式很像,以下這些是一樣的:數(shù)學+-/*%字符串連接+邏輯&&||二進制&|^一元運算+-!~移位>>>>><<比較==><>=<=instanceof分組()nullCast方法調(diào)用數(shù)據(jù)訪問[]三元運算?:示例:android:text="@{String.valueOf(index
+
1)}"
android:visibility="@{age
<
13
?
View.GONE
:
View.VISIBLE}"
android:transitionName='@{"image_"
+
id}'缺少的操作:thissuper
new顯式泛型調(diào)用Null合并操作??-左邊的對象如果它不是null,選擇左邊的對象;或者如果它是null,選擇右邊的對象:android:text="@{user.displayName??user.lastName}"函數(shù)上的寫法如下:android:text="@{user.displayName
!=
null
?
user.displayName
:
user.lastName}"屬性引用***個已經(jīng)在前邊提到了a)DataBinding表達式:JavaBean引用的簡短格式。當一個表達式引用一個類的屬性,它仍使用同樣的格式對于字段、getters以及ObservableFields。android:text="@{user.lastName}"
避免
NullPointerExceptionDataBinding代碼生成時自動檢查是否為nulls來避免出現(xiàn)nullpointerexceptions錯誤。例如,在表達式@{}中,如果user是null,會賦予它的默認值(null)。如果你引用user.age,age是int類型,那么它的默認值是0。集合常用的集合:arrays、lists、sparselists以及maps,為了簡便都可以使用[]來訪問。<data>
<import
type="android.util.SparseArray"/>
<import
type="java.util.Map"/>
<import
type="java.util.List"/>
<variable
name="list"
type="List<String>"/>
<variable
name="sparse"
type="SparseArray<String>"/>
<variable
name="map"
type="Map<String,
String>"/>
<variable
name="index"
type="int"/>
<variable
name="key"
type="String"/>
</data>
…
android:text="@{list[index]}"
…
android:text="@{sparse[index]}"
…
android:text="@{map[key]}"字符串當使用單引號包含屬性值時,在表達式中使用雙引號很容易:android:text='@{map["firstName"]}'使用雙引號來包含屬性值也是可以的。字符串前后需要使用"`":android:text="@{map[`firstName`]}"
android:text="@{map["firstName"]}"
Resources使用正常的表達式來訪問resources也是可行的:android:padding="@{large?@dimen/largePadding:@dimen/smallPadding}"格式化字符串和復數(shù)可以通過提供參數(shù)來判斷android:text="@{@string/nameFormat(firstName,
lastName)}"
android:text="@{@plurals/banana(bananaCount)}"當復數(shù)需要多個參數(shù)時,所有的參數(shù)都會通過:Have
an
orange
Have
%d
oranges
android:text="@{@plurals/orange(orangeCount,
orangeCount)}"一些資源需要顯式類型判斷:類型正常引用表達式引用String[]
@array
@stringArray
int[]
@array
@intArray
TypedArray
@array
@typedArray
Animator
@animator
@animator
StateListAnimator
@animator
@stateListAnimator
color
int
@color
@color
ColorStateList
@color
@colorStateList5.Data對象任何PlainoldJavaobject(POJO)可用于DataBinding,但修改POJO不會導致UI更新。DataBinding的真正能力是當數(shù)據(jù)變化時,可以通知給你的Data對象。有三種不同的數(shù)據(jù)變化通知機制:Observable對象、ObservableFields以及observablecollections。當這些可觀察Data對象綁定到UI,Data對象屬性的更改后,UI也將自動更新。Observable對象實現(xiàn)android.databinding.Observable接口的類可以允許附加一個監(jiān)聽器到Bound對象以便監(jiān)聽對象上的所有屬性的變化。Observable接口有一個機制來添加和刪除監(jiān)聽器,但通知與否由開發(fā)人員管理。為了使開發(fā)更容易,一個BaseObservable的基類為實現(xiàn)監(jiān)聽器注冊機制而創(chuàng)建。Data實現(xiàn)類依然負責通知當屬性改變時。這是通過指定一個Bindable注解給getter以及setter內(nèi)通知來完成的。private
static
class
User
extends
BaseObservable
{
private
String
firstName;
private
String
lastName;
@Bindable
public
String
getFirstName()
{
return
this.firstName;
}
@Bindable
public
String
getFirstName()
{
return
this.lastName;
}
public
void
setFirstName(String
firstName)
{
this.firstName
=
firstName;
notifyPropertyChanged(BR.firstName);
}
public
void
setLastName(String
lastName)
{
this.lastName
=
lastName;
notifyPropertyChanged(BR.lastName);
}
}在編譯期間,Bindable注解在BR類文件中生成一個Entry。BR類文件會在模塊包內(nèi)生成。如果用于Data類的基類不能改變,Observable接口通過方便的PropertyChangeRegistry來實現(xiàn)用于儲存和有效地通知監(jiān)聽器。Observable字段一些小工作會涉及到創(chuàng)建Observable類,因此那些想要節(jié)省時間或者幾乎沒有幾個屬性的開發(fā)者可以使用ObservableFields。ObservableFields是自包含具有單個字段的observable對象。它有所有基本類型和一個是引用類型。要使用它需要在data對象中創(chuàng)建publicfinal字段:private
static
class
User
extends
BaseObservable
{
public
final
ObservableField<String>
firstName
=
new
ObservableField<>();
public
final
ObservableField<String>
lastName
=
new
ObservableField<>();
public
final
ObservableInt
age
=
new
ObservableInt();
}就是這樣,要訪問該值,使用set和get方法:user.firstName.set("Google");intage=user.age.get();Observable集合一些app使用更多的動態(tài)結構來保存數(shù)據(jù)。Observable集合允許鍵控訪問這些data對象。ObservableArrayMap用于鍵是引用類型,如String。ObservableArrayMap<String,
Object>
user
=
new
ObservableArrayMap<>();
user.put("firstName",
"Google");
user.put("lastName",
"Inc.");
user.put("age",
17);在layout文件中,通過String鍵可以訪問map:<data>
<import
type="android.databinding.ObservableMap"/>
<variable
name="user"
type="ObservableMap<String,
Object>"/>
</data>
…
<TextView
android:text='@{user["lastName"]}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text='@{String.valueOf(1
+
(Integer)user["age"])}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
ObservableArrayList用于鍵是整數(shù):
ObservableArrayList<Object>
user
=
new
ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add(17);在layout文件中,通過索引可以訪問list:<data>
<import
type="android.databinding.ObservableList"/>
<import
type="com.example.my.app.Fields"/>
<variable
name="user"
type="ObservableList<Object>"/>
</data>
…
<TextView
android:text='@{user[Fields.LAST_NAME]}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text='@{String.valueOf(1
+
(Integer)user[Fields.AGE])}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
6.
Binding生成Binding類的生成鏈接了layout中variables與Views。如前面所討論的,Binding的名稱和包名可以定制。所生成的Binding類都擴展了android.databinding.ViewDataBinding。創(chuàng)建Binding應在inflation之后就立馬創(chuàng)建,以確保View層次結構不在之前打擾layout中的binding到views上的表達式。有幾個方法可以綁定到一個layout。最常見的是在Binding類上使用靜態(tài)方法.inflate方法載入View的層次結構并且綁定到它只需這一步。還有一個更簡單的版本,只需要LayoutInflater還有一個是采用ViewGroup:MyLayoutBindingbinding=MyLayoutBinding.inflate(layoutInflater);MyLayoutBindingbinding=MyLayoutBinding.inflate(LayoutInflater,viewGroup,false);如果使用不同的機制載入layout,他可一分開綁定:MyLayoutBindingbinding=MyLayoutBinding.bind(viewRoot);有時Binding不能提前知道,對于這種情況,可以使用DataBindingUtil類來創(chuàng)建Binding:ViewDataBinding
binding
=
DataBindingUtil.inflate(LayoutInflater,
layoutId,
parent,
attachToParent);
ViewDataBinding
binding
=
DataBindingUtil.bindTo(viewRoot,
layoutId);帶ID的Views在layout中對于每個帶ID的View會生成一個publicfinal字段。Binding在View層次結構上做單一的傳遞,提取帶ID的Views。這種機制比起某些Views使用findViewById還要快。例如:<layout
xmlns:android="/apk/res/android">
<data>
<variable
name="user"
type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:id="@+id/firstName"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:id="@+id/lastName"/>
</LinearLayout>
</layout>它會生成如下的Binding類:publicfinalTextViewfirstName;publicfinalTextViewlastName;IDs不像沒有DataBindings那樣幾乎沒有必要,但是仍然會有一些實例需要從代碼中訪問Views。Variables每個Variable會有訪問方法。<data>
<import
type="android.graphics.drawable.Drawable"/>
<variable
name="user"
type="com.example.User"/>
<variable
name="image"
type="Drawable"/>
<variable
name="note"
type="String"/>
</data>它會在Binding中生成setters和getters:public
abstract
com.example.User
getUser();
public
abstract
void
setUser(com.example.User
user);
public
abstract
Drawable
getImage();
public
abstract
void
setImage(Drawable
image);
public
abstract
String
getNote();
public
abstract
void
setNote(String
note);ViewStubsViewStubs跟正常的Views略有不同。他們開始時是不可見的,當他們要么設置為可見或被明確告知要載入時,它們通過載入另外一個layout取代了自己。由于ViewStub基本上從View的層次結構上消失,在Binding對象的View也必須消失來允許被收集。因為Views是***的,一個ViewStubProxy對象取帶ViewStub,給開發(fā)者獲得了ViewStub,當它存在以及還可以訪問載入的View層次結構時當ViewStub已被載入時。當載入另一個layout,為新的布局必需創(chuàng)建一個Binding。因此,ViewStubProxy必需監(jiān)聽ViewStub的OnInflateListener監(jiān)聽器并在那個時候建立Binding。因為只有一個可以存在,ViewStubProxy允許開發(fā)者在其上設置一個OnInflateListener它會在建立Binding后調(diào)用。Binding進階動態(tài)Variables有時,不知道具體的Binding類,例如,一個RecyclerView適配器對layouts任意操作并不知道具體的Binding類。它仍然必需在onBindViewHolder期間賦值給Binding。在這個例子中,該RecyclerView綁定的所有l(wèi)ayouts有一個“item”的Variable。該BindingHolder有一個getBinding方法返回ViewDataBinding。public
void
onBindViewHolder(BindingHolder
holder,
int
position)
{
final
T
item
=
mItems.get(position);
holder.getBinding().setVariable(BR.item,
item);
holder.getBinding().executePendingBindings();
}直接Binding當一個variable或observable變化時,binding會在下一幀之前被計劃要改變。有很多次,但是在Binding時必須立即執(zhí)行。要強制執(zhí)行,使用executePendingBindings()方法。后臺線程只要它不是一個集合,你可以在后臺線程中改變你的數(shù)據(jù)模型。在判斷是否要避免任何并發(fā)問題時,DataBinding會對每個Varialbe/field本地化。7.屬性Setters每當綁定值的變化,生成的Binding類必須調(diào)用setter方法。DataBinding框架有可以自定義賦值的方法。自動Setters對于一個屬性,DataBinding試圖找到setAttribute方法。與該屬性的namespace并不什么關系,僅僅與屬性本身名稱有關。例如,有關TextView的android:text屬性的表達式會尋找一個setText(String)的方法。如果表達式返回一個int,DataBinding會搜索的setText(int)方法。注意:要表達式返回正確的類型,如果需要的話使用casting。DataBinding仍會工作即使沒有給定名稱的屬性存在。然后,您可以通過DataBinding輕松地為任何setter“創(chuàng)造”屬性。例如,DrawerLayout沒有任何屬性,但大量的setters。您可以使用自動setters來使用其中的一個。<android.support.v4.widget.DrawerLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:scrimColor="@{@color/scrim}"
app:drawerListener="@{fragment.drawerListener}"/>重命名的Setters一些有setters的屬性按名稱并不匹配。對于這些方法,屬性可以通過BindingMethods注解相關聯(lián)。這必須與一個包含BindingMethod注解的類相關聯(lián),每一個用于一個重命名的方法。例如,android:tint屬性與setImageTintList相關聯(lián),而不與setTint相關。@BindingMethods({
@BindingMethod(type
=
"android.widget.ImageView",
attribute
=
"android:tint",
method
=
"setImageTintList"),
})以上例子,開發(fā)者需要重命名setters是不太可能了,android架構屬性已經(jīng)實現(xiàn)了。自定義Setters有些屬性需要自定義綁定邏輯。例如,對于android:paddingLeft屬性并沒有相關setter。相反,setPadding(left,top,right,bottom)是存在在。一個帶有BindingAdapter注解的靜態(tài)綁定適配器方法允許開發(fā)者自定義setter如何對于一個屬性的調(diào)用。Android的屬性已經(jīng)創(chuàng)造了BindingAdapters。舉例來說,對于pad
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年氈呢、包裝用織物制品項目發(fā)展計劃
- 2025年糖、加工糖及制糖副產(chǎn)品項目發(fā)展計劃
- 人教版音樂課程五年級教學設計計劃
- 無人機應用項目設計進度計劃
- 小學五年級暑假計劃(33篇)
- 大學生健身活動線上線下結合計劃
- 湖南版一年級美術社會實踐活動計劃
- 直播設備全套合同范本
- 露營裝備轉讓合同范本
- 小學數(shù)學三年級上冊知識補差計劃
- 《設備管理標準化實施手冊》
- 湖南省長沙市明達中學2024-2025學年九年級下學期入學考試英語試卷(含答案無聽力原文及音頻)
- 汽車站建設項目可行性研究報告
- 《中國古典園林之美》課件
- 2024年09月上海2024交通銀行交銀金融科技校園招考筆試歷年參考題庫附帶答案詳解
- 2025年人教五四新版八年級數(shù)學上冊階段測試試卷
- 2025年廣西中馬欽州產(chǎn)業(yè)園區(qū)管委會招商服務有限公司招聘筆試參考題庫附帶答案詳解
- 《李寧戰(zhàn)略選擇》課件
- DB33T 2222-2019 船載寬帶衛(wèi)星通信終端主要技術參數(shù)要求
- 公路護坡施工合同
- 2025年廣東省財政廳所屬事業(yè)單位公開招聘歷年高頻重點提升(共500題)附帶答案詳解
評論
0/150
提交評論