知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
Android學(xué)習(xí)筆記十五.深入理解fragment(三)之《兼容多
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):75
深刻懂得fragment(三)
之《兼容多分辨率的應(yīng)用》拭魅戰(zhàn)
在上一篇博文中介紹了若何應(yīng)用Android Fragment開辟實(shí)用于大年夜屏幕應(yīng)用,如今我們?cè)谏弦粋€(gè)應(yīng)用的基本上持續(xù)進(jìn)修若何應(yīng)用Fragment開辟兼容多分辨率的應(yīng)用。
[img]http://img.blog.csdn.net/20150104175535634?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
[img]http://blog.csdn.net/u012637501/article/details/42395447/file:/C:/Users/Jiangdongguo/AppData/Local/YNote/data/[email protected]/59ba06ae72fc4c8bac3f32a384442a45/clipboard.png
1.建立/res/values-large/refs.xml引用資本文件
為了開辟兼顧屏幕分辨率的應(yīng)用,我們須要建立一個(gè)引用資本文件,專門用于定義各類引用項(xiàng)。refs.xml引用資本文件中定義了一項(xiàng)引用,其感化就是標(biāo)明activity_book_list實(shí)際引用(@)/res/layout/activity_book_twopane.xml界面構(gòu)造文件。
之所以如許應(yīng)用,目標(biāo)是為了在Activity加載R.layout.activity_book_list時(shí)將會(huì)根據(jù)運(yùn)行平臺(tái)的屏幕大年夜小主動(dòng)選擇界面構(gòu)造文件:在大年夜屏幕的平板電腦上,R.layout.activity_book_list將會(huì)變成/res/layout/目次小的activity_book_twopane界面構(gòu)造文件;在小屏幕的手機(jī)上,R.layout.activity_book_list依然引用/res/layout/目次下的activity_book_list.xml界面構(gòu)造文件。源碼如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <!--定義activity_book_list實(shí)際引用@layout/activity_book_twopane資本 --> <item type="layout" name="activity_book_list"> @layout/activity_book_twopane</item> </resources>
2.建立/res/layout/activity_book_list.xml小屏幕界面構(gòu)造文件
該構(gòu)造文件僅僅是顯示BookListFragment組件(android:name="包名.BookListFragment"),即該界面構(gòu)造文件中只是顯示圖書列表。源碼如下:
<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:name="com.example.android_fragment_1.BookListFragment" android:id="@+id/book_list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginRight="16dp" android:layout_marginLeft="16dp"/>
3.建立/res/layout/activity_book_twopane.xml大年夜屏幕界面構(gòu)造文件
這個(gè)構(gòu)造文件就定義了Activity的顯示界面:左邊將會(huì)顯示一個(gè)ListFragment,右邊只是一個(gè)FrameLayout容器。個(gè)中FrameLayout容器將會(huì)動(dòng)態(tài)更新個(gè)中顯示的Fragment。
<?xml version="1.0" encoding="utf-8"?> <!-- 定義一個(gè)水等分列的LinearLayout,并指定應(yīng)用中等分隔條 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:divider="?android:attr/dividerHorizontal" android:showDividers="middle"> <!-- 應(yīng)用資本文件方法:添加一個(gè)fragment到Activity中 --> <fragment android:name="com.example.android_fragment_1.BookListFragment" android:id="@+id/book_list" android:layout_height="match_parent" android:layout_width="0dp" android:layout_weight="1"/> <!-- 添加一個(gè)FrameLayout容器,用于顯示圖書具體信息 --> <FrameLayout android:id="@+id/book_detail_container" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3"/> </LinearLayout>
4.建立/src/../BookListActivity.java主Activity
實(shí)現(xiàn)BookListActivity將會(huì)針對(duì)不合屏幕分辨率來加載不合的界面構(gòu)造文件,即經(jīng)由過程獲取界面資本文件"activity_book_list",剖斷該界面構(gòu)造文件中是否包含有ID為book_detail_containner的組件。如不雅有,則解釋為大年夜屏幕應(yīng)用的是activity_book_twopane.xml界面構(gòu)造文件;不然,為activity_book_list.xml界面構(gòu)造文件。源碼如下:
package com.example.android_fragment_1; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class BookListActivity extends Activity implements BookListFragment.Callbacks { //1.定義一個(gè)旗標(biāo),用于標(biāo)識(shí)是否該應(yīng)用是否支撐大年夜屏幕 private boolean mTwoPane; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //2.指定加載activity_book_list對(duì)應(yīng)的界面構(gòu)造文件,實(shí)際上會(huì)根據(jù)分辨率選擇響應(yīng)的構(gòu)造界面 setContentView(R.layout.activity_book_list); //3.如不雅加載的界面構(gòu)造文件中包含ID為book_detail_container的組件,則解釋支撐大年夜屏幕 if(findViewById(R.id.book_detail_container)!=null) { mTwoPane=true; //支撐大年夜屏幕 ((BookListFragment)getFragmentManager() .findFragmentById(R.id.book_list)) .setActivateOnItemClick(true); } } //4.實(shí)現(xiàn)Fragment與Activity交互辦法 @Override public void onItemSelected(Integer id) { /*如不雅加載的是大年夜屏幕構(gòu)造界面文件*/ if(mTwoPane) { //a.創(chuàng)建Bundle,預(yù)備向Fragment傳入?yún)?shù)(將鍵值對(duì)綁定到arguments對(duì)象中) Bundle arguments=new Bundle(); arguments.putInt(BookDetailFragment.ITEM_ID,id); //b.創(chuàng)建BookDetailFragment對(duì)象,并向Fragment傳入?yún)?shù) BookDetailFragment fragment=new BookDetailFragment(); fragment.setArguments(arguments); //c.應(yīng)用fragment調(diào)換book_detail_container容器當(dāng)前顯示的Fragment getFragmentManager().beginTransaction() .WordStr(R.id.book_detail_container, fragment).commit(); } /*如不雅加載的是小屏幕構(gòu)造界面文件*/ else { //a.創(chuàng)建啟動(dòng)BookDetailActivity的Intent Intent detailIntent=new Intent(this,BookDetailActivity.class); //b.設(shè)置傳遞給BookDetailActivity參數(shù),并啟動(dòng)Activity detailIntent.putExtra(BookDetailFragment.ITEM_ID, id); startActivity(detailIntent); } } }
5.建立/src/../BookDetailActivity.java顯示圖書詳情Activity
BookDetailActivity重要用于顯示小屏幕圖書詳情,他將直接復(fù)竽暌姑已有的BookDetailFragment。重要完成兩個(gè)功能:一是當(dāng)用戶當(dāng)即Activity某個(gè)列表項(xiàng)時(shí),會(huì)Intent跳轉(zhuǎn)到該Activity并將打包的某圖書詳情顯示在Activity上;二是,該Activity還啟用了ActionBar上的應(yīng)用法度榜樣擱筆,許可用戶點(diǎn)擊該擱筆返回到法度榜樣的主Activity。
package com.example.android_fragment_1; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; public class BookDetailActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //1.指定加載/res/layout目次下的activity_book_detail.xml構(gòu)造文件 setContentView(R.layout.activity_book_detail); //2.將ActionBar上應(yīng)用擱筆轉(zhuǎn)換成可點(diǎn)擊的按鈕 getActionBar().setDisplayHomeAsUpEnabled(true); if(savedInstanceState==null) { //a.創(chuàng)建BookDetailFragment對(duì)象 BookDetailFragment fragment=new BookDetailFragment(); //b.創(chuàng)建Bundle對(duì)象 Bundle arguments=new Bundle(); arguments.putInt(BookDetailFragment.ITEM_ID, getIntent() .getIntExtra(BookDetailFragment.ITEM_ID,0)); //c.向Fragment傳入?yún)?shù) fragment.setArguments(arguments); //d.指定fragment添加到book_detail_container容器中 getFragmentManager().beginTransaction() .add(R.id.book_detail_container, fragment).commit(); } } //3.按下擱筆響應(yīng) @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub if(item.getItemId()==android.R.id.home) { //a.創(chuàng)建啟動(dòng)BookListActivity的Intent Intent intent=new Intent(this,BookListActivity.class); //b.添加額外的Flag,將Activity棧中處于FirstActivity之上的Activity彈出 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); //c.啟動(dòng)intent對(duì)應(yīng)的Activity startActivity(intent); return true; } return super.onOptionsItemSelected(item); } /res/layout目次下的activity_book_detail.xml構(gòu)造文件 該界面構(gòu)造文件內(nèi)只定義了一個(gè)ID名為book_detail_container的FrameLayout,用于顯示圖書詳情。 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/book_detail_container" > </FrameLayout>
6.建立/src/../BookDetailFragment.java顯示圖書詳情Fragment
當(dāng)為大年夜屏幕時(shí),此時(shí)BookListFragment和BookDetailFragment就起感化了,前者為列表Fragment,后者為包含兩個(gè)文本框組件的Fragment。別的,主Activity加載的是activity_book_
twopane.xml界面構(gòu)造文件。
onItemSelected()傳入的參數(shù)id是列表的被選中的行ID, BookDetailFragment 用這個(gè)ID來大年夜法度榜樣的ContentProvider中取得標(biāo)題標(biāo)內(nèi)容。
(1)實(shí)現(xiàn)onCreate(Bundle savedInstanceState)辦法:
獲取啟動(dòng)該Fragment時(shí)傳入的ITEM_ID參數(shù)并根據(jù)該ID獲取BookContent的ITEM_MAP中的圖手札息
(2)實(shí)現(xiàn)onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)辦法:
a.為圖書詳情Fragment加載一個(gè)界面構(gòu)造文件,為兩個(gè)文本框;
b.根據(jù)傳入的參數(shù)ID來更新View容器,使文本框顯示不合的內(nèi)容;
package com.example.android_fragment_1; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /*功能: * 應(yīng)用Fragment將會(huì)顯示加載一份簡(jiǎn)單的界面構(gòu)造文件,并根據(jù)傳入的參數(shù)來更新 * 界面組件*/ public class BookDetailFragment extends Fragment { public static final String ITEM_ID="item_id"; BookContent.Book book; //保存該Fragment顯示的book對(duì)象 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //如不雅啟動(dòng)該Fragment時(shí)包含了ITEM_ID參數(shù),個(gè)中 Map containsKey(String Key) 斷定key有沒有對(duì)應(yīng)的value值; 有,則返回true 沒有,則返回false //大年夜Bundle對(duì)象中獲取傳入的參數(shù)(鍵值對(duì)) if(getArguments().containsKey(ITEM_ID)) { book=BookContent.ITEM_MAP.get(getArguments().getInt(ITEM_ID)); //獲取啟動(dòng)該Fragment時(shí)傳入的ITEM_ID參數(shù)并根據(jù)該ID獲取BookContent的ITEM_MAP中的圖手札息? } } //2.重寫該辦法:該辦法返回的View將作為Fragment顯示的組件 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //a.加載/res/layout/目次下的fragment_book_detail.xml構(gòu)造文件,返回一個(gè)view目標(biāo)使該fragment的構(gòu)造顯示在Activity中 View view=inflater.inflate(R.layout.fragment_book_detail, //指明當(dāng)前fragment的資本文件 container, //父容器控件 false); //注解是否連接該構(gòu)造和其父容器控件(這里體系已經(jīng)插入了構(gòu)造到父容器中) /*將圖手札息中的標(biāo)題、屬性顯示在容器的兩個(gè)文本框中*/ if(book!=null) { //b.讓book_title文本框顯示book對(duì)象的title屬性 ((TextView) view.findViewById(R.id.book_title)).setText(book.title); //c.讓book_desc文本框顯示book對(duì)象的desc屬性 ((TextView) view.findViewById(R.id.book_desc)).setText(book.desc); } return view; } }
個(gè)中界面資本構(gòu)造文件為/res/layout/fragment_book_detail.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- 定義一個(gè)TextView來顯示圖書標(biāo)題 -->
<TextView
style="?android:attr/textAppearanceLarge"
android:id="@+id/book_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"/>
<!-- 定義一個(gè)TextView來顯示圖書描述 -->
<TextView
style="?android:attr/textAppearanceLarge"
android:id="@+id/book_desc"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"/>
</LinearLayout>
7.建立/src/../BookListFragment.java顯示圖書詳情Fragment
自定義類,持續(xù)于ListFragment,無需實(shí)現(xiàn)OnCreateView()辦法,用于Activity右邊顯示列表fragment。
(1)定義Callbacks接口:定義一個(gè)回調(diào)接口Callback,用于實(shí)現(xiàn)該Fragment與它地點(diǎn)的Activity交互;
(2)實(shí)現(xiàn)onCreate(Bundle savedInstanceState)辦法:經(jīng)由過程Adapter所供給的多個(gè)列表項(xiàng),設(shè)置Fragment列表顯示的列表項(xiàng);
(3)實(shí)現(xiàn)onAttach(Activity activity)辦法:將Fragment添加并顯示到Acitvity中,并將傳入的activity對(duì)象強(qiáng)迫類型轉(zhuǎn)化為 Callbacks接口對(duì)象,以便調(diào)用接口公共辦法onItemSelected(Integer id)響應(yīng)用戶單擊的某列表項(xiàng);
(4)實(shí)現(xiàn)ListFragment的onListItemClick(ListView l, View v, int position, long id)辦法:
當(dāng)用戶點(diǎn)擊Acitivity中的某項(xiàng)列表時(shí),onListItemClick辦法被激發(fā)。在這個(gè)辦法中調(diào)用接口的onItemSelected來竽暌閨activity共享事宜。onItemSelected()傳入的參數(shù)id是列表的被選中的行ID,另一個(gè)fragment(B)( BookDetailFragment )用這個(gè)ID來大年夜法度榜樣的ContentProvider中取得標(biāo)題標(biāo)內(nèi)容。
package com.example.android_fragment_1; import android.app.Activity; import android.app.ListFragment; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; public class BookListFragment extends ListFragment { //1.定義一個(gè)回調(diào)接口Callback,用于實(shí)現(xiàn)該Fragment與它地點(diǎn)的Activity交互(留意:該接口的實(shí)現(xiàn)須要在Activit中) private Callbacks mCallbacks; //Callbacks接口對(duì)象 public interface Callbacks { public void onItemSelected(Integer id); //參數(shù)為Map集合的鍵 } //2.onCreate辦法中為該ListFragment設(shè)置Adapter,讓該ListFragment顯示該Adapter所供給的多個(gè)列表項(xiàng) @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setListAdapter(new ArrayAdapter<BookContent.Book>(getActivity(),// android.R.layout.simple_list_item_activated_1, android.R.id.text1, BookContent.ITEMS)); // } //3.調(diào)用該辦法將Fragment添加并顯示到Acitvity中 @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); //a.如不雅Activity中沒有實(shí)現(xiàn)Callbacks接口,拋出異常 if(!(activity instanceof Callbacks)) { throw new IllegalStateException("異常:BookListFragment地點(diǎn)的Activity必須實(shí)現(xiàn)Callback接口!"); } //把該Activity當(dāng)成Callbacks對(duì)象(就是這一句導(dǎo)致出現(xiàn)NullPointerException缺點(diǎn)) mCallbacks=(Callbacks)activity; } //4.當(dāng)該Fragment大年夜他所屬的Acitivity中被刪除時(shí),調(diào)用該辦法 @Override public void onDetach() { super.onDetach(); mCallbacks=null; //將mCallbacks賦值為null } //5.當(dāng)用戶單擊某列表項(xiàng)時(shí)激發(fā)該回調(diào)辦法 @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); mCallbacks.onItemSelected(BookContent.ITEMS.get(position).id);//激發(fā)mCallbacks接口的onItemSelected辦法 } public void setActivateOnItemClick(boolean activateOnItemClick) { getListView().setChoiceMode(activateOnItemClick ? ListView.CHOICE_MODE_SINGLE:ListView.CHOICE_MODE_NONE); } }
須要留意的是,不像BookDetailFragment,因?yàn)槠涑掷m(xù)于ListFragment,無需實(shí)現(xiàn)OnCreateView()辦法。是以,無需定義界面構(gòu)造文件。
8.res/../BookContent.java:
用于模仿體系的數(shù)據(jù)模型
(1)List集合為左邊f(xié)ragment供給圖書(標(biāo)題)列表項(xiàng)數(shù)據(jù)
public static List<Book> ITEMS=new ArrayList<Book>();
對(duì)于List集合來說,book為(1,"猖狂Android教材","小我評(píng)價(jià):這本書很好,就是有點(diǎn)厚!"2...3...)
(2)Map集合為右邊f(xié)ragment供給圖書詳情(標(biāo)題、屬性)數(shù)據(jù)
public static Map<Integer,Book> ITEM_MAP =new HashMap<Integer,Book>();
對(duì)應(yīng)Map集合來說,鍵book.id<--->值(1.......2.......3......)
package com.example.android_fragment_1; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class BookContent { //1.定義一個(gè)內(nèi)部類,作為體系的營業(yè)對(duì)象 public static class Book { public Integer id; //Map鍵 public String title; public String desc; public Book(Integer id,String title,String desc)//構(gòu)造函數(shù),初始化圖書詳情的"map鍵,標(biāo)題,內(nèi)容" { this.id=id; this.title=title; this.desc=desc; } public String toString() { return title; } } //2.應(yīng)用List集合記錄體系所包含的Book對(duì)象ITEMS,應(yīng)用它調(diào)用其add(對(duì)象)辦法項(xiàng)List集合中添加列表項(xiàng) public static List<Book> ITEMS=new ArrayList<Book>(); //3.應(yīng)用Map集合記錄體系所包含的Book對(duì)象ITEM_MAP,應(yīng)用它調(diào)用put(Key,Value)辦法向Map集合中添加列表項(xiàng) public static Map<Integer,Book> ITEM_MAP =new HashMap<Integer,Book>(); static{ //應(yīng)用靜態(tài)初始化代碼,將Book對(duì)象添加到List集合、Map集合中 addItem(new Book(1,"猖狂Android教材","小我評(píng)價(jià):這本書很好,就是有點(diǎn)厚!")); addItem(new Book(2,"數(shù)學(xué)之美","小我評(píng)價(jià):來自天然語音的使者")); addItem(new Book(3,"大年夜話數(shù)據(jù)構(gòu)造","小我評(píng)價(jià):不知道如何,據(jù)說很不錯(cuò)")); } private static void addItem(Book book) { // TODO Auto-generated method stub ITEMS.add(book); //添加List集合中列表項(xiàng) ITEM_MAP.put(book.id,book);//添加Map集合中列表項(xiàng) } }
/*注釋:
* static{},稱為static代碼塊,也叫靜態(tài)代碼塊。是在類中自力于類成員的static語句塊,可以有多個(gè)且地位可以隨便放。
* 它不屬于任何的辦法體內(nèi),JVM加載類時(shí)會(huì)履行這些靜態(tài)的代碼塊,如不雅有多個(gè)則按先后次序履行且每個(gè)代碼塊智會(huì)被履行依次。
* 比如,我們可以應(yīng)用靜態(tài)代碼塊可以對(duì)一些statci變量進(jìn)行賦值*/
9.修改AndroidManifest.xml
因?yàn)樵谠创a中實(shí)現(xiàn)了一個(gè)BookDetailActivity,所以我們須要在工程文件中聲明它。
<application .......> <activity android:name=".BookListActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".BookDetailActivity" android:label="@string/app_name" > </activity> </application> </manifest>
小屏幕顯示效不雅:
[img]http://img.blog.csdn.net/20150104175515953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
[img]http://blog.csdn.net/u012637501/article/details/42395447/file:/C:/Users/Jiangdongguo/AppData/Local/YNote/data/[email protected]/d25fb13bd1944507b74e951741ab0124/clipboard.png
大年夜屏幕顯示效不雅:
[img]http://img.blog.csdn.net/20150104175507413?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
相關(guān)案例查看更多
相關(guān)閱讀
- 網(wǎng)站維護(hù)
- 關(guān)鍵詞快速排名
- 網(wǎng)站建設(shè)選
- 云南網(wǎng)站建設(shè)公司哪家好
- 全國前十名小程序開發(fā)公司
- 云南網(wǎng)站建設(shè)優(yōu)化
- 網(wǎng)站搭建
- 云南網(wǎng)站建設(shè)首選
- 云南網(wǎng)絡(luò)公司
- 云南企業(yè)網(wǎng)站
- 昆明網(wǎng)站建設(shè)公司
- 云南網(wǎng)站建設(shè)快速優(yōu)化
- 云南電商網(wǎng)站建設(shè)
- 網(wǎng)站建設(shè)需要多少錢
- Web開發(fā)框架
- 網(wǎng)絡(luò)公司排名
- 汽車報(bào)廢
- 百度小程序公司
- 楚雄小程序開發(fā)
- 網(wǎng)站建設(shè)快速優(yōu)化
- 海報(bào)插件
- 昆明軟件定制
- 云南網(wǎng)站建設(shè)高手
- 分銷系統(tǒng)
- 網(wǎng)站建設(shè)哪家強(qiáng)
- 制作一個(gè)小程序
- 汽車報(bào)廢回收管理軟件
- 網(wǎng)站建設(shè)
- 網(wǎng)絡(luò)公司報(bào)價(jià)
- 服務(wù)器