Android之 Fragment

什么是Fragment:

Android是在Android 3.0 (API level 11)開始引入Fragment的。

可以把Fragment想成Activity中的模塊,這個模塊有自己的布局,有自己的生命周期,單獨處理自己的輸入,在Activity運行的時候可以加載或者移除Fragment模塊。

可以把Fragment設計成可以在多個Activity中復用的模塊。

當開發的應用程序同時適用于平板電腦和手機時,可以利用Fragment實現靈活的布局,改善用戶體驗。

?

?

Fragment的意義:

?Android在3.0中引入了fragments的概念,主要目的是用在大屏幕設備上--例如平板電腦上,支持更加動態和靈活的UI設計。平板電腦的屏幕要比手機的大得多,有更多的空間來放更多的UI組件,并且這些組件之間會產生更多的交互。Fragment允許這樣的一種設計,而不需要你親自來管理 viewhierarchy的復雜變化。 通過將activity的布局分散到fragment中, 你可以在運行時修改activity的外觀,并在由activity管理的back stack中保存那些變化.??

例如, 一個新聞應用可以在屏幕左側使用一個fragment來展示一個文章的列表,然后在屏幕右側使用另一個fragment來展示一篇文章--2個fragment并排顯示在相同的一個activity中,并且每一個fragment擁有它自己的一套生命周期回調方法,并且處理它們自己的用戶輸入事件。 因此, 取代使用一個activity來選擇一篇文章而另一個activity來閱讀文章的方式,用戶可以在同一個activity中選擇一篇文章并且閱讀, 如圖所示:

?

fragment在你的應用中應當是一個模塊化和可重用的組件.即,因為fragment定義了它自己的布局, 以及通過使用它自己的生命周期回調方法定義了它自己的行為,你可以將fragment包含到多個activity中. 這點特別重要, 因為這允許你將你的用戶體驗適配到不同的屏幕尺寸.舉個例子,你可能會僅當在屏幕尺寸足夠大時,在一個activity中包含多個fragment,并且,當不屬于這種情況時,會啟動另一個單獨的,使用不同fragment的activity.

繼續之前那個新聞的例子 -- 當運行在一個特別大的屏幕時(例如平板電腦),應用可以在Activity A中嵌入2個fragment。然而,在一個正常尺寸的屏幕(例如手機)上,沒有足夠的空間同時供2個fragment用, 因此, Activity A會僅包含文章列表的fragment, 而當用戶選擇一篇文章時, 它會啟動ActivityB,它包含閱讀文章的fragment.因此, 應用可以同時支持上圖中的2種設計模式。

?

?

Fragment的生命周期:

因為Fragment必須嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相關的。

如果Activity是暫停狀態,其中所有的Fragment都是暫停狀態;如果Activity是stopped狀態,這個Activity中所有的Fragment都不能被啟動;如果Activity被銷毀,那么它其中的所有Fragment都會被銷毀。(對Activity不熟悉的話,請看另一篇文章《Android四大組件之Activity》)

但是,當Activity在活動狀態,可以獨立控制Fragment的狀態,比如加上或者移除Fragment。

當這樣進行fragment transaction(轉換)的時候,可以把fragment放入Activity的back stack中,這樣用戶就可以進行返回操作。

?

?

Fragment的使用:

創建Fragment

要創建一個fragment, 必須創建一個 Fragment 的子類 (或者繼承自一個已存在的它的子類DialogFragment,ListFragment,PreferenceFragment,WebViewFragment). Fragment類的代碼看起來很像 Activity 。它包含了和activity類似的回調方法, 例如onCreate()、 onStart()、onPause()以及 onStop()。事實上, 如果你準備將一個現成的Android應用轉換到使用fragment,可能只需簡單的將代碼從你的activity的回調方法分別移動到你的fragment的回調方法即可。

? ????通常, 應當至少實現如下的生命周期方法:

  • onCreate()
    當創建fragment時, 系統調用該方法.?
    在實現代碼中,應當初始化想要在fragment中保持的必要組件, 當fragment被暫停或者停止后可以恢復.
  • onCreateView()
    fragment第一次繪制它的用戶界面的時候, 系統會調用此方法. 為了繪制fragment的UI,此方法必須返回一個View, 這個view是你的fragment布局的根view. 如果fragment不提供UI, 可以返回null.
  • onPause()
    用戶將要離開fragment時,系統調用這個方法作為第一個指示(然而它不總是意味著fragment將被銷毀.) 在當前用戶會話結束之前,通常應當在這里提交任何應該持久化的變化(因為用戶有可能不會返回).

?

大多數應用應當為每一個fragment實現至少這3個方法,但是還有一些其他回調方法你也應當用來去處理fragment生命周期的各種階段.全部的生命周期回調方法將會在后面章節 Handlingthe Fragment Lifecycle 中討論.

? ????除了繼承基類 Fragment , 還有一些子類你可能會繼承:

?

    • DialogFragment
      顯示一個浮動的對話框.??
      用這個類來創建一個對話框,是使用在Activity類的對話框工具方法之外的一個好的選擇,
      因為你可以將一個fragment對話框合并到activity管理的fragment back stack中,允許用戶返回到一個之前曾被摒棄的fragment.
    • ListFragment
      顯示一個由一個adapter(例如 SimpleCursorAdapter)管理的項目的列表, 類似于ListActivity.
      它提供一些方法來管理一個list view, 例如 onListItemClick()回調來處理點擊事件.
    • PreferenceFragment
      顯示一個 Preference對象的層次結構的列表, 類似于PreferenceActivity.?
      這在為你的應用創建一個"設置"activity時有用處.

?

實現Fragment的UI

  提供Fragment的UI,必須實現onCreateView()方法。

  假設Fragment的布局設置寫在example_fragment.xml資源文件中,那么onCreateView()方法可以如下寫:

public static class ExampleFragment extends Fragment
{@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.example_fragment, container, false);}
}

onCreateView()中container參數代表該Fragment在Activity中的父控件;savedInstanceState提供了上一個實例的數據。

  inflate()方法的三個參數:

  第一個是resource ID,指明了當前的Fragment對應的資源文件;

  第二個參數是父容器控件;

  第三個布爾值參數表明是否連接該布局和其父容器控件,在這里的情況設置為false,因為系統已經插入了這個布局到父控件,設置為true將會產生多余的一個View Group。

?

把Fragment加入Activity

?

  當Fragment被加入Activity中時,它會處在對應的View Group中。

?

  Fragment有兩種加載方式:一種是在Activity的layout中使用標簽<fragment>聲明;另一種方法是在代碼中把它加入到一個指定的ViewGroup中。

?

  另外,Fragment它可以并不是Activity布局中的任何一部分,它可以是一個不可見的部分。這部分內容先略過。

?

?

?

加載方式1:通過Activity的布局文件將Fragment加入Activity

?

  在Activity的布局文件中,將Fragment作為一個子標簽加入即可。

?

  如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><fragment android:name="com.example.news.ArticleListFragment"android:id="@+id/list"android:layout_weight="1"android:layout_width="0dp"android:layout_height="match_parent" /><fragment android:name="com.example.news.ArticleReaderFragment"android:id="@+id/viewer"android:layout_weight="2"android:layout_width="0dp"android:layout_height="match_parent" />
</LinearLayout>

其中android:name屬性填上你自己創建的fragment的完整類名。

  當系統創建這個Activity的布局文件時,系統會實例化每一個fragment,并且調用它們的onCreateView()方法,來獲得相應fragment的布局,并將返回值插入fragment標簽所在的地方。

  有三種方法為Fragment提供ID:

  android:id屬性:唯一的id

  android:tag屬性:唯一的字符串

  如果上面兩個都沒提供,系統使用容器view的ID。

?

加載方式2:通過編程的方式將Fragment加入到一個ViewGroup中

  當Activity處于Running狀態下的時候,可以在Activity的布局中動態地加入Fragment,只需要指定加入這個Fragment的父View Group即可。

  首先,需要一個FragmentTransaction實例: 

FragmentManager fragmentManager = getFragmentManager()FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

  (注,如果import android.support.v4.app.FragmentManager;那么使用的是:FragmentManager fragmentManager = getSupportFragmentManager();)

  之后,用add()方法加上Fragment的對象:

ExampleFragment fragment = new ExampleFragment();fragmentTransaction.add(R.id.fragment_container, fragment);fragmentTransaction.commit();

  其中第一個參數是這個fragment的容器,即父控件組。

  最后需要調用commit()方法使得FragmentTransaction實例的改變生效。

?

Fragment對menu菜單的操作

android4.0之后引入了fragment的概念,它的生命周期函數和activity幾乎一樣。對菜單的操作也是通過onCreateOptionMenu()實現的。

fragment可以通過實現 onCreateOptionMenu() 提供菜單項給activity的選項菜單。為了使這個方法接收調用,無論如何, 你必須在 onCreate() 期間調用 setHasOptionsMenu() 來指出fragment愿意添加item到選項菜單(否則, fragment將接收不到對 onCreateOptionsMenu()的調用)
隨后從fragment添加到Option菜單的任何項,都會被 追加到現有菜單項的后面.當一個菜單項被選擇, fragment也會接收到 對 onOptionsItemSelected() 的回調.也可以在你的fragment layout中通過調用 registerForContextMenu() 注冊一個view來提供一個環境菜單.當用戶打開環境菜單, fragment接收到一個對 onCreateContextMenu() 的調用.當用戶選擇一個項目, fragment接收到一個對onContextItemSelected() 的調用。
注意: 盡管你的fragment會接收到它所添加的每一個菜單項被選擇后的回調, ?但實際上當用戶選擇一個菜單項時, activity會首先接收到對應的回調.如果activity的on-item-selected回調函數實現并沒有處理被選中的項目, 然后事件才會被傳遞到fragment的回調。

例子:

onCreate() 期間調用 setHasOptionsMenu() 來指出fragment愿意添加item到選項菜單

public static class DetailsFragment extends Fragment {@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setHasOptionsMenu(true);}
}

操作菜單

 @Overridepublic void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {// TODO Auto-generated method stubsuper.onCreateOptionsMenu(menu, inflater);menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubToast.makeText(getActivity(), "index is"+getShownIndex()+" && menu text is "+item.getTitle(), 1000).show();return super.onOptionsItemSelected(item);}

?

?

還記得文章上面提到過的閱讀新聞的例子嗎?(講Fragment意義那里)下面,我就來實現這個功能:

我們先貼出效果圖:

(豎屏)

???????點擊第二條新聞后,如下圖:

?

(橫屏狀態)

?

下面貼上代碼:

?先要創建兩個布局文件,一個用于橫屏、一個用于豎屏:

?其代碼分別為:

layout/main.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="horizontal" ><fragment class="com.topcsa.test_fragment.ListFragment"android:id="@+id/titles"android:layout_weight="1"android:layout_width="0px"android:layout_height="match_parent"/></LinearLayout>

layout-land/main.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="horizontal" ><fragment class="com.topcsa.test_fragment.ListFragment"android:id="@+id/titles"android:layout_weight="1"android:layout_width="0px"android:layout_height="match_parent"/><FrameLayout android:id="@+id/detail"android:layout_weight="2"android:layout_width="0px"android:layout_height="match_parent"android:background="?android:attr/detailsElementBackground"></FrameLayout></LinearLayout>

?

包下的文件如下:

下面依次貼上代碼(代碼有詳細注釋):

?

package com.topcsa.test_fragment;public final class Data {public static final String[] titles = { "日本買兩棲艦欲圓航母夢 最后得雞肋","中將:中國坦克兵素質優異 96A凸顯四大質量問題", "臺灣政壇又炸鍋:與大陸首席談判代表是“共諜”" };public static final String[] DETAIL = {"日本防衛相小野寺五典8月4日在東京都發表演講又一次強調了兩棲攻擊艦的重要性,指出日本將從美國購買黃蜂級兩棲攻擊艦。若發展順利,新型兩棲攻擊艦將于2019年服役日本海上自衛隊,成為其最大艦艇。","首先,這主要是一場坦克乘員素質的比賽,比技能、比體能、比心理素質。應該說中國坦克兵表現堪稱完美。射擊比賽第一,除了裝備因素外,嫻熟的操作技能和全車乘員協調一致的動作,是獲勝的關鍵。裝備性能可以提供高命中率的客觀條件,但在高速行進中(在視頻中看,96A坦克行進間射擊的時速應在20-25千米/小時)能發發命中目標,則主要取決于人的因素。而T-72坦克行進間射擊時速都不超過10千米/小時,甚至是短停射擊,差距就大了。96A坦克上反式穩像火控的反應速度、精度和在復雜工況條件的穩定性,大大超過了T-72下反式火控。96坦克初期型號也是下反式穩像火控,遠不至于在這次比賽中T-72坦克表現得這么差,這就是坦克乘員的素質在起作用了。只能說中國坦克兵的素質高于國外同行。另外,我軍坦克兵射擊訓練的難度大大超過了這次競賽條件。譬如射擊跑道是起伏的、彎曲的,目標間夾角不小于17密位(這次比賽也就1-2密位),打完一個目標后需要大角度、高速度調炮瞄向下一個目標;目標不僅是隱顯的,還是隱蔽的,周圍不能有明顯方位物(這次比賽在靶標附近設立了一個獨立家屋,便于搜索和指示目標);96A坦克在訓練中以打運動目標為主,目標時速不低于12千米/小時(這次目標是固定的,目標色彩與背景反差也較大),如果換成運動目標,估計T-72坦克脫靶的更多。裝備也是重要因素。在視頻中看到,T-72坦克彈跡和彈著點都能看到,說明它的炮口初速不大于1000米/秒,而96A坦克根本看不到彈跡,彈著點煙塵也小很多,貫穿布靶時形成一個小洞,說明我炮口初速和鎢芯脫殼穿甲彈的侵徹力遠高于T-72坦克。我命中部位大多進入目標9區(井字格,四周8個區,中心為9區),說明我坦克炮千米立靶密集度集中,精度高、彈道穩定。","兩岸發展關系,臺灣的政治穩定至關重要。臺灣社會很多人或許沒有意識到,臺灣政治的一些深層無序已經相當嚴重。大陸與世界很多經濟體談自貿區或類似協定,但唯有同臺灣的這一份冒出遭學生抗議并擱置的離奇周折,張顯耀也是第一位被疑遭大陸“策反”的首席談判代表。", };
}
View Code

?

package com.topcsa.test_fragment;import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ScrollView;
import android.widget.TextView;public class DetailFragment extends Fragment {public static DetailFragment newInstance(int index){DetailFragment f=new DetailFragment();Bundle bundle=new Bundle();bundle.putInt("index", index);f.setArguments(bundle);//將bundle對象作為Fragment的參數保存return f;}public int getShownIndex(){//獲取要顯示的列表項索引return getArguments().getInt("index",0);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {if(container==null){return null;}//創建一個滾動視圖ScrollView sl=new ScrollView(getActivity());TextView text=new TextView(getActivity());text.setPadding(10, 10, 10, 10);sl.addView(text);//設置文本框中要顯示的文本
        text.setText(Data.DETAIL[getShownIndex()]);return sl;}
}
View Code

?

package com.topcsa.test_fragment;import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;public class ListFragment extends android.app.ListFragment {boolean dualPane;// 是否在同一界面上顯示列表和內容int curCheckPosition = 0;// 當前選擇的索引位置
@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);//為列表設置適配器setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_checked, Data.titles));//獲取布局文件中添加的幀布局管理器View detailFrame=getActivity().findViewById(R.id.detail);//判斷是否在一屏上同時顯示列表和詳細內容dualPane=detailFrame!=null&&detailFrame.getVisibility()==View.VISIBLE;if(savedInstanceState!=null){//更新當前的索引位置curCheckPosition=savedInstanceState.getInt("curChoice",0);}if(dualPane){//設置列表為單選模式
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);showDetails(curCheckPosition);//顯示詳細內容
        }}//該方法在STOP()之前執行,用于保存當前選中項的列表項的索引值
    @Overridepublic void onSaveInstanceState(Bundle outState) {// TODO Auto-generated method stubsuper.onSaveInstanceState(outState);outState.putInt("curChoice", curCheckPosition);}@Overridepublic void onListItemClick(ListView l, View v, int position, long id) {// TODO Auto-generated method stubshowDetails(position);//顯示詳細內容
    }private void showDetails(int index) {curCheckPosition=index;if(dualPane){getListView().setItemChecked(index, true);//設置選中狀態//獲取用于顯示詳細信息的FragmentDetailFragment df=(DetailFragment) getFragmentManager().findFragmentById(R.id.detail);if(df==null||df.getShownIndex()!=index){//創建一個新的DetailFragment實例,用于顯示當前選項對應的詳細內容df=DetailFragment.newInstance(index);//在Activity中管理fragment,需要使用FragmentManager//獲得一個FragmentTransaction實例FragmentTransaction ft=getFragmentManager().beginTransaction();//替換原來顯示的詳細內容
                ft.replace(R.id.detail, df);//設置轉換效果
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);ft.commit();//提交事務
            }}else{//豎屏Intent intent=new Intent(getActivity(),MainActivity.DetailActivity.class);intent.putExtra("index", index);startActivity(intent);}}}
View Code

?

package com.topcsa.test_fragment;import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}public static class DetailActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);// 判斷是否為橫屏if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {finish();return;}if (savedInstanceState == null) {//在初始化時,插入一個顯示詳細內容的Fragment//實例化DetailFragment對象DetailFragment detail = new DetailFragment();//設置傳遞的參數
                detail.setArguments(getIntent().getExtras());//添加一個顯示詳細內容的Fragment
                getFragmentManager().beginTransaction().add(android.R.id.content, detail).commit();}}}}
View Code

?

最后,別忘了清單文件的配置:(內部Activity的注冊)

<activity android:name="com.topcsa.test_fragment.MainActivity$DetailActivity"android:label="詳細內容"></activity>

?

?

?新聞閱讀Demo下載:http://download.csdn.net/detail/af74776/7806353

?

?

本文重點參考了的文章(基本上算是大匯總吧):http://blog.csdn.net/lilu_leo/article/details/7671533

                     http://www.cnblogs.com/mengdd/archive/2013/01/08/2851368.html

                     http://www.cnblogs.com/yydcdut/p/3921297.html

轉載于:https://www.cnblogs.com/scetopcsa/p/3930733.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260094.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260094.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260094.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

怎么用python檢索法律_法律人,你的檢索與處理信息的方式,決定了你的專業程度...

昨天在后臺收到一位讀者留言&#xff1a;“我花了2天時間到各法院官網、法律數據庫網站、裁判文書及判例網站上搜索近十年我國經濟類犯罪案例。好不容易將案件手動分類&#xff0c;整理判例的定罪和量刑情況給當前的案子作參考&#xff0c;現在看到了結論&#xff0c;也不敢確定…

HDU1753: 大明A+B

大明AB Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5533 Accepted Submission(s): 1870 Problem Description話說&#xff0c;經過了漫長的一個多月&#xff0c;小明已經成長了許多&#xff0c;所以他改了…

倒戈了,轉投簡書 --------

深情自白 還記得數月前那個月黑風高的晚上&#xff0c;筆主偶遇簡書&#xff0c;被那婀娜多姿的Markdown輸出深深吸引不能自拔&#xff0c;從此立下毒誓要兩邊同時發布。然而天有不測風云&#xff08;這邊的太丑&#xff09;&#xff0c;前思后想寢食難安之后作出決定&#xff…

如何通過windows控制linux,如何從Windows遠程控制Linux | MOS86

ifconfig將顯示您需要連接的IP地址。 如果Linux盒具有以太網連接&#xff0c;則該地址將在eth0旁邊列出。 如果以無線方式連接&#xff0c;請查找針對wlan0列出的IP地址。如果這不容易或不方便&#xff0c;則有另一種方法幾乎同樣簡單。 在瀏覽器窗口中&#xff0c;連接到路由器…

簡明Vim練級攻略(初學者)

http://blog.jobbole.com/18339/轉載于:https://www.cnblogs.com/sherry00/p/3931023.html

安卓psp模擬器聯機教程_刺激戰場國際服下載方法教程!安卓ios模擬器都有

刺激戰場國際服不需要VPN&#xff0c;不需要加速器。刺激戰場國際服賬號可以使用微信登入&#xff0c;進游戲頁面點擊more就可以了。安卓系統&#xff1a;①下載網易UU加速器&#xff0c;通過網易UU加速器平臺直接下載。②有的機型不能通過網易UU下載&#xff0c;但是可以通過Q…

[轉載] 民兵葛二蛋——第1集

轉載于:https://www.cnblogs.com/6DAN_HUST/archive/2013/01/15/2860782.html

菜鳥的jQuery源碼學習筆記(三)

1 each: function(callback, args) {2 return jQuery.each(this, callback, args);3 }, each:這個調用了jQuery.each方法&#xff0c;來遍歷當前集合。我們先來看看jQuery.each方法: //args是一個數組 each: function(obj, callback, args) {var value,i 0,length o…

docker pdf 中文版 linux,Docker入門實戰手冊PDF

一、為什么要使用 Docker&#xff1f;1 、快速交付應用程序? 開發者使用一個標準的image 來構建開發容器&#xff0c;開發完成之后&#xff0c;系統管理員就可以使用這個容器來部署代碼? Docker 可以快速創建容器&#xff0c;快速迭代應用程序&#xff0c;并讓整個過程可見…

C#環境下的鉤子詳解

C#環境下的鉤子詳解 摘自網上供自己備查: http://www.csharpwin.com/csharpspace/2423.shtml 1、 WINDOWS的消息機制 2、 HOOK介紹 3、 HOOK鏈 4、 HOOK鉤子的作用范圍 5、 HOOK類型 6、 回調函數 7、 HOOK鉤子的安裝與卸載 8、 HOOK實例演示 WINDOWS的消息機制 Windows系統是…

福昕PDF閱讀器的圖章妙用

前幾天同事發來一個pdf文件&#xff0c;說要把其中一部分遮住。我本來還想用pdf編輯軟件直接給刪除&#xff0c;結果發現是掃描文件制作的pdf不能編輯&#xff0c;大呼坑爹又要用ps了&#xff08;那家伙太慢&#xff0c;太占內存&#xff09;。 不想打開ps&#xff0c;于是開始…

openldap linux客戶端,OpenLDAP 客戶端安裝部署

六、OpenLDAP客戶端驗證1、配置/etc/openldap/ldap.conf默認客戶端不允許查詢OpenLDAP條目信息&#xff0c;如果需要讓客戶端查詢條目&#xff0c;需要添加OpenLDAP服務端的URI以及BASE條目&#xff0c;命令如下&#xff1a;2、客戶端驗證用戶的信息添加我已經在上篇博文里面介…

奮斗的IT小小鳥

寫了兩集的《迷茫的IT小小鳥》&#xff0c;在經過了這么長的墮落與反思的階段&#xff0c;終于也有點豁然開朗的感覺了&#xff0c;這學期以來浪費了太多的時間&#xff0c;本來規劃的很好的時間和任務在自己一次次的說服不了自己的過程中終究沒能實現&#xff0c;在這個期間更…

基于.Net Framework 4.0 Web API開發(4):ASP.NET Web APIs 基于令牌TOKEN驗證的實現

概述&#xff1a; ASP.NET Web API 的好用使用過的都知道&#xff0c;沒有復雜的配置文件&#xff0c;一個簡單的ApiController加上需要的Action就能工作。但是在使用API的時候總會遇到跨域請求的問題&#xff0c; 特別各種APP萬花齊放的今天&#xff0c;對API使用者身份角色驗…

匈牙利命名法為何被淘汰_為何甲烷的習慣命名法用甲烷而不是一烷?

其實在有機化合物中文翻譯早期&#xff0c;是有過用數字命名的階段的&#xff0c;先上圖。部分有機化合物在不同時期的漢譯名對照那么后來為何未采用數字&#xff0c;而使用天干。與商務印書館和鄭貞文個人其實有很大關系。那么有機物中文命名的演進是怎樣的呢&#xff1f;下面…

Windows下Mysql Cluster集群啟動腳本與啟動服務添加方法

3.2.8 集群啟動腳本及啟動服務注冊 從上面的啟動過程我們可以看出&#xff0c;Mysql集群啟動命令較復雜&#xff0c;容易造成cmd窗口因誤操作關閉而導致的數據庫停止&#xff0c;在此我介紹一下如何將這些命令的操作變成windos的服務項&#xff0c;當windos啟動時&#xff0…

c語言中for語句的作用是,c語言中for語句是怎么用的

匿名用戶1級2018-11-20 回答1&#xff1a;for循環for語句的格式為&#xff1a;for (初始化語句; 條件語句; 控制語句){語句1 ;語句2 ;....語句n ;}for 語句的執行順序是&#xff1a;首先執行“初始化語句”&#xff1b;然后測試“條件語句”&#xff1b;若條件成立&#xff0c;…

[Azure] Notification Hubs注冊模式

[Azure] Notification Hubs注冊模式 關于Azure Notification Hubs的注冊模式&#xff0c;可以參考下列連結的文件內容。 Notification Hubs Features - Registration Management 文件里介紹了兩種注冊模式&#xff1a;手機主動注冊、服務代理注冊&#xff0c;這兩個模式主要的差…

iOS 本地化應用程序匯總 國際化

最近要做一個應用要實現本地化&#xff0c;因為使用的是xcode4&#xff0c;應用程序本地化的問題跟以前的版本還是有些不同&#xff0c;在網上找了些資料對于xcode4以上的版本資料還是相對較少&#xff0c;有些最后要通過手動創建文件&#xff0c;這樣操作實在是太麻煩&#xf…

圖卷積神經網絡_深度層次化圖卷積神經網絡

來源&#xff1a;IJCAI 2019論文地址&#xff1a;https://arxiv.org/abs/1902.06667代碼地址&#xff1a;https://github.com/CRIPAC-DIG/H-GCNIntroduction1、問題定義&#xff1a;什么是半監督的節點分類&#xff1f;圖1 半監督節點分類如圖1所示&#xff0c;在標記數據量很少…