掌握Android Fragment開發之魂:Fragment的深度解析(上)


Fragment是Android開發中用于構建動態和靈活界面的基石。它不僅提升了應用的模塊化程度,還增強了用戶界面的動態性和交互性,允許開發者將應用界面劃分為多個獨立、可重用的部分,每個部分都可以獨立于其他部分進行操作。本文將從以下幾個方面深入探討Fragment的核心特性、優勢、生命周期,以及如何通過靜態和動態添加來豐富你的應用。


一、Fragment的特點


Fragment是Android中非常強大和靈活的概念,它極大地簡化了構建動態和可適應不同屏幕尺寸的復雜UI的過程。通過合理利用Fragment,您可以構建模塊化、可重用和高效的Android應用程序。


以下是Fragment的一些主要特點:

  1. 模塊化UI: Fragment允許您將UI分解為獨立的模塊化組件。每個Fragment都定義了自己的布局和行為,并且可以在活動中添加、刪除或替換。這使得構建可重用的UI組件和適應不同屏幕尺寸變得更加容易。

  2. 生命周期管理: 與Activity類似,Fragment也有自己的生命周期。系統負責管理Fragment的生命周期,使您能夠專注于編寫代碼而不必擔心生命周期問題。Fragment的生命周期回調與Activity的生命周期回調類似,但Fragment的生命周期優先于托管它的Activity。

  3. 向后兼容性: 在舊版本的Android系統上,Fragment提供了一種模擬新UI模式的方法。即使在較舊的Android版本上,您也可以編寫支持片段的應用程序。

  4. 動態UI: Fragment可以在運行時動態添加到Activity布局中。這為您提供了靈活性,可以根據不同的條件動態構建和改變UI。

  5. 嵌套Fragment: Fragment可以嵌套在另一個Fragment中,這為構建復雜的UI層次結構提供了極大的靈活性。

  6. 支持多窗格設計: Fragment非常適合在大屏幕設備(如平板電腦)上實現多窗格UI設計。您可以將不同的Fragment組合在一個Activity中,并根據設備方向和大小調整布局。

  7. 提高可重用性: Fragment可以在多個Activity之間共享和重用。這不僅提高了代碼的可重用性,還減少了代碼重復,從而提高了應用程序的可維護性。

  8. Fragment事務: Fragment事務允許您在Activity布局中添加、移除、替換和附加Fragment。您可以通過提交一系列Fragment事務來構建復雜的UI流程。

  9. 支持RetainInstance: Fragment可以在配置更改(如設備旋轉)時保留其實例。這意味著您可以避免重新創建昂貴的對象,從而提高應用程序的性能和響應能力。

  10. 向后兼容庫支持: Android提供了對舊版本系統的Fragment向后兼容庫支持。即使在較舊的Android版本上,您也可以使用Fragment提供的大多數功能。


二、Fragment的生命周期

在這里插入圖片描述


Fragment的生命周期與Activity緊密相關,但有自己的特點。了解Fragment的生命周期對于正確管理Fragment至關重要。

Android Fragment擁有自己的生命周期,類似于Activity的生命周期。Fragment的生命周期回調方法與Activity非常相似,但又有一些獨特之處。下面是Fragment生命周期的詳細介紹,并通過Java代碼示例進行演示:


1、onAttach(Context)

當Fragment與Activity實例關聯時調用。可以在此方法中獲取Activity的引用,并執行一些初始化操作。

@Override
public void onAttach(@NonNull Context context) {super.onAttach(context);// 獲取Activity引用并執行初始化操作
}

2、onCreate(Bundle)

在Fragment創建時調用。可以在此方法中初始化一些數據和狀態。

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 初始化數據和狀態
}

3、onCreateView(LayoutInflater, ViewGroup, Bundle)

創建并返回Fragment的視圖層次結構。

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_layout, container, false);// 初始化視圖return view;
}

4、onViewCreated(View, Bundle)

在Fragment的視圖層次結構創建完成后調用。可以在此方法中進行視圖的初始化操作。

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);// 初始化視圖
}

5、onActivityCreated(Bundle)

在Activity的onCreate方法執行完畢后調用。

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);// 執行一些與Activity相關的操作
}

6、onStart()

當Fragment變為可見狀態時調用


7、onResume()

當Fragment開始交互時調用。


8、onPause()

當Fragment從交互狀態切換到暫停狀態時調用。可以在此方法中釋放一些資源。


9、onStop()

當Fragment不再可見時調用。


10、onDestroyView()

在Fragment的視圖層次結構被銷毀時調用。


11、onDestroy()

在Fragment被銷毀之前調用。可以在此方法中釋放資源。


12、onDetach()

當Fragment與Activity實例分離時調用。


此外,Fragment還提供了一些額外的生命周期回調方法,用于處理保存和恢復實例狀態:

13、onSaveInstanceState(Bundle)

當Fragment需要保存狀態時調用。可以在此方法中保存數據。

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);// 保存數據
}

14、onViewStateRestored(Bundle)

在Fragment視圖狀態被恢復后調用。可以在此方法中恢復數據。

@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {super.onViewStateRestored(savedInstanceState);// 恢復數據
}

三、Fragment的使用方式


在 Android 應用程序中使用 Fragment 有幾種常見的方式,包括靜態添加、動態添加和使用 FragmentManager 進行事務管理。下面通過 Java 代碼示例演示每種方式:


1、靜態添加 Fragment


靜態添加 Fragment 是指在 Activity 的布局文件中直接定義 Fragment。這種方式適用于在應用啟動時就需要顯示的 Fragment。


(1)、 創建Fragment布局文件

首先,我們需要為每個Fragment創建一個布局文件。

fragment_a.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"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Fragment A"android:textSize="24sp" /><Buttonandroid:id="@+id/btn_fragment_a"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Click Me" /></LinearLayout>
fragment_b.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"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Fragment B"android:textSize="24sp" /><Buttonandroid:id="@+id/btn_fragment_b"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Click Me" /></LinearLayout>

(2)、 創建Fragment類


接下來,我們需要創建兩個Fragment類,每個類對應一個Fragment布局。

FragmentA.java
public class FragmentA extends Fragment {@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_a, container, false);Button btnFragmentA = view.findViewById(R.id.btn_fragment_a);btnFragmentA.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 處理按鈕點擊事件Toast.makeText(getActivity(), "Fragment A Button Clicked", Toast.LENGTH_SHORT).show();}});return view;}
}
FragmentB.java
public class FragmentB extends Fragment {@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_b, container, false);Button btnFragmentB = view.findViewById(R.id.btn_fragment_b);btnFragmentB.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 處理按鈕點擊事件Toast.makeText(getActivity(), "Fragment B Button Clicked", Toast.LENGTH_SHORT).show();}});return view;}
}

(3)、 在Activity布局中靜態添加Fragment

現在,我們將在Activity的布局文件中靜態添加兩個Fragment。

activity_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"><fragmentandroid:id="@+id/fragment_a"android:name="com.example.FragmentA"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /><fragmentandroid:id="@+id/fragment_b"android:name="com.example.FragmentB"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /></LinearLayout>

在上面的布局文件中,我們使用<fragment>標簽來靜態添加兩個Fragment。android:name屬性指定了Fragment的完全限定類名,android:id屬性為每個Fragment提供了一個唯一的標識符。


(4)、MainActivity

最后,我們只需要創建一個空的MainActivity即可,因為所有的Fragment都已經在布局文件中靜態添加了。

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}

當你運行這個應用程序時,你會看到兩個Fragment并排顯示在屏幕上,每個Fragment中都有一個按鈕。點擊這些按鈕會顯示相應的Toast消息。


靜態添加Fragment是一種簡單而直接的方式,適用于在應用啟動時就需要顯示Fragment的情況。但是,如果你需要動態添加、移除或替換Fragment,那么你需要使用FragmentManager來管理Fragment事務。


2、動態添加 Fragment

動態添加 Fragment 是指在運行時通過代碼將 Fragment 添加到 Activity 的布局中。這種方式適用于根據用戶交互或其他條件動態顯示 Fragment。

我們將創建一個主Activity,其布局文件中包含一個容器用于顯示Fragment。我們將定義兩個Fragment,并使用FragmentManager在容器中進行Fragment的添加、替換和移除操作。

(1)、 創建Fragment布局文件

首先,我們需要為每個Fragment創建一個布局文件。

fragment_a.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"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Fragment A"android:textSize="24sp" /></LinearLayout>
fragment_b.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"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Fragment B"android:textSize="24sp" /></LinearLayout>

(2)、創建Fragment類

接下來,我們需要創建兩個Fragment類,每個類對應一個Fragment布局。

FragmentA.java
public class FragmentA extends Fragment {@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_a, container, false);}
}
FragmentB.java
public class FragmentB extends Fragment {@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_b, container, false);}
}

(3)、創建Activity布局

接下來,我們將創建Activity的布局文件,其中包含一個容器用于顯示Fragment,以及四個按鈕用于控制Fragment的添加、替換和移除操作。

activity_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="vertical"><FrameLayoutandroid:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_add_fragment_a"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Add Fragment A" /><Buttonandroid:id="@+id/btn_replace_fragment_b"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Replace with Fragment B" /><Buttonandroid:id="@+id/btn_remove_fragment"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Remove Fragment" /><Buttonandroid:id="@+id/btn_attach_fragment"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Attach Fragment" /></LinearLayout></LinearLayout>

在上面的布局文件中,我們使用<FrameLayout>作為容器來顯示Fragment。下面的<LinearLayout>中包含四個按鈕,分別用于添加FragmentA、替換為FragmentB、移除當前Fragment和附加Fragment。


(4)、 MainActivity

最后,我們將創建MainActivity并實現按鈕的點擊事件,用于動態添加和移除Fragment。

public class MainActivity extends AppCompatActivity {private FragmentManager fragmentManager;private FrameLayout fragmentContainer;private FragmentA fragmentA;private FragmentB fragmentB;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);fragmentManager = getSupportFragmentManager();fragmentContainer = findViewById(R.id.fragment_container);Button btnAddFragmentA = findViewById(R.id.btn_add_fragment_a);btnAddFragmentA.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {addFragment(new FragmentA());}});Button btnReplaceFragmentB = findViewById(R.id.btn_replace_fragment_b);btnReplaceFragmentB.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {replaceFragment(new FragmentB());}});Button btnRemoveFragment = findViewById(R.id.btn_remove_fragment);btnRemoveFragment.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {removeFragment();}});Button btnAttachFragment = findViewById(R.id.btn_attach_fragment);btnAttachFragment.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {attachFragment();}});// 初始化并添加 FragmentAfragmentA = new FragmentA();addFragment(fragmentA);}private void addFragment(Fragment fragment) {FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.add(R.id.fragment_container, fragment);transaction.addToBackStack(null);transaction.commit();}private void replaceFragment(Fragment fragment) {FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.replace(R.id.fragment_container, fragment);transaction.addToBackStack(null);transaction.commit();}private void removeFragment() {Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);if (fragment != null) {FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.remove(fragment);transaction.commit();}}private void attachFragment() {if (fragmentB == null) {fragmentB = new FragmentB();FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.add(R.id.fragment_container, fragmentB);transaction.detach(fragmentB);transaction.commit();} else {FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.attach(fragmentB);transaction.commit();}}
}

MainActivity中,我們首先獲取FragmentManager和容器FrameLayout的實例。然后,我們為三個按鈕設置點擊事件監聽器。

  • "Add Fragment A"按鈕會調用addFragment()方法,將FragmentA實例動態添加到容器中。
  • "Add Fragment B"按鈕會調用addFragment()方法,將FragmentB實例動態添加到容器中。
  • "Remove Fragment"按鈕會調用removeFragment()方法,移除當前容器中的Fragment。

addFragment()方法中,我們使用FragmentTransaction來添加Fragment。我們還調用了addToBackStack()方法,這樣當用戶按下返回鍵時,Fragment就會從容器中移除。

removeFragment()方法中,我們首先使用findFragmentById()方法獲取當前容器中的Fragment實例。如果存在Fragment,我們就使用FragmentTransaction將其從容器中移除。


當你運行這個應用程序時,你會看到一個空白的容器和三個按鈕。點擊"Add Fragment A"或"Add Fragment B"按鈕,相應的Fragment就會動態添加到容器中。點擊"Remove Fragment"按鈕,當前容器中的Fragment就會被移除。你還可以反復添加和移除Fragment,觀察其行為。


3、使用 FragmentManager 管理 Fragment

FragmentManager 提供了一系列方法用于管理 Fragment 的生命周期和事務。我們可以使用它來添加、移除、替換和附加 Fragment。


public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 獲取 FragmentManagerFragmentManager fragmentManager = getSupportFragmentManager();// 開啟一個事務FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();// 替換 FragmentFragment fragmentA = new FragmentA();fragmentTransaction.replace(R.id.fragment_container, fragmentA);// 提交事務fragmentTransaction.commit();}
}

MainActivity中,我們首先獲取FragmentManager和容器FrameLayout的實例,并初始化fragmentAfragmentB實例。


然后,我們為四個按鈕設置點擊事件監聽器:

  • "Add Fragment A"按鈕會調用addFragment()方法,將FragmentA實例添加到容器中。

  • "Replace with Fragment B"按鈕會調用replaceFragment()方法,用FragmentB實例替換當前容器中的Fragment。

  • "Remove Fragment"按鈕會調用removeFragment()方法,移除當前容器中的Fragment。

  • "Attach Fragment"按鈕會調用attachFragment()方法,首次點擊時會添加并分離FragmentB實例,之后點擊則會重新附加該Fragment實例。


讓我們逐一了解這些方法的實現:

首先,addFragment()方法

private void addFragment(Fragment fragment) {FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.add(R.id.fragment_container, fragment);transaction.addToBackStack(null);transaction.commit();
}

這個方法使用FragmentTransaction來添加一個新的Fragment實例到容器中。我們調用add()方法來添加Fragment,并使用addToBackStack()方法將該事務添加到回退棧中,以便用戶可以通過返回鍵來撤銷該操作。


其次,replaceFragment()方法:

private void replaceFragment(Fragment fragment) {FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.replace(R.id.fragment_container, fragment);transaction.addToBackStack(null);transaction.commit();
}

這個方法使用FragmentTransaction將當前容器中的Fragment替換為一個新的Fragment實例。我們調用replace()方法來替換Fragment,并同樣使用addToBackStack()方法將該事務添加到回退棧中。


然后,removeFragment()方法:

private void removeFragment() {Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);if (fragment != null) {FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.remove(fragment);transaction.commit();}
}

這個方法首先使用findFragmentById()方法獲取當前容器中的Fragment實例。如果存在Fragment,我們就使用FragmentTransaction將其從容器中移除。


最后,attachFragment()方法:

private void attachFragment() {if (fragmentB == null) {fragmentB = new FragmentB();FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.add(R.id.fragment_container, fragmentB);transaction.detach(fragmentB);transaction.commit();} else {FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.attach(fragmentB);transaction.commit();}
}

這個方法用于演示detach()attach()方法的使用。首次點擊"Attach Fragment"按鈕時,我們會添加一個新的FragmentB實例,然后立即將其分離。之后再次點擊該按鈕時,我們會重新附加該Fragment實例。這種做法可以在不銷毀Fragment的情況下臨時隱藏它,從而保留其狀態。


在上面的代碼中,我們還在onCreate()方法中初始化并添加了FragmentA實例。

當你運行這個應用程序時,你會看到一個顯示FragmentA的容器和四個按鈕。你可以嘗試點擊不同的按鈕,觀察Fragment的添加、替換、移除和附加/分離操作。

通過這個案例,能夠更好地理解如何使用FragmentManager來管理Fragment的生命周期和事務。FragmentManager提供了豐富的方法,如add()replace()remove()attach()detach()等,讓你可以靈活地控制Fragment的行為。你還可以使用addToBackStack()方法將Fragment事務添加到回退棧中,從而實現類似Activity的導航行為。


結語:

通過本文的深入解析,你應該對Fragment有了更全面的理解。無論是在構建新的應用還是優化現有項目,Fragment都是你不可或缺的工具。Fragment的潛力遠不止于此。

在下一篇文章中,我們將探索如何使用Fragment實現更高級的界面切換效果,以及如何在Fragment之間傳遞數據。敬請期待!


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

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

相關文章

信息系統項目管理師0102:可行性研究的內容(7項目立項管理—7.2項目可行性研究—7.2.1可行性研究的內容)

點擊查看專欄目錄 文章目錄 7.2項目可行性研究7.2.1可行性研究的內容1.技術可行性分析2.經濟可行性分析3.社會效益可行性分析4.運行環境可行性分析5.其他方面的可行性分析記憶要點總結7.2項目可行性研究 可行性研究是在項目建議書被批準后,從技術、經濟、社會和人員等方面的條…

OpenWrt項目UCI配置介紹

UCI&#xff08;Unified Configuration Interface&#xff09;是 OpenWrt 項目中使用的一種配置管理系統。它旨在為嵌入式設備提供一個統一且易于理解的配置接口。UCI 主要用于簡化 OpenWrt 系統的各種配置過程&#xff0c;使得管理網絡、服務和其他系統參數變得更加方便。 1 …

String的substring()方法導致的內存泄露問題

JDK 6的實現 String(int offset, int count, char value[]) {this.value value;this.offset offset;this.count count; }public String substring(int beginIndex, int endIndex) {//check boundaryreturn new String(offset beginIndex, endIndex - beginIndex, value);…

r語言數據分析案例-北京市氣溫預測分析與研究

一、選題背景 近年來&#xff0c;人類大量燃燒煤炭、天然氣等含碳燃料導致溫室氣 體過度排放&#xff0c;大量溫室氣體強烈吸收地面輻射中的紅外線&#xff0c;造 成溫室效應不斷累積&#xff0c;使得地球溫度上升&#xff0c;造成全球氣候變暖。 氣象溫度的預測一直以來都是…

[算法][差分][延遲相差][leetcode]2960. 統計已測試設備

題目地址&#xff1a; https://leetcode.cn/problems/count-tested-devices-after-test-operations/description/ 解法一&#xff1a;暴力解法 class Solution {public int countTestedDevices(int[] batteryPercentages) {//特殊條件判斷if(null batteryPercentages || ba…

JavaScript DOM 對元素進行的操作

DOM&#xff08;Document Object Model&#xff09;是一種用于訪問和操作HTML和XML文檔的編程接口。JavaScript通過DOM提供的方法和屬性可以對網頁的元素進行各種操作&#xff0c;比如修改元素的內容、樣式、屬性等。 下面是一些常見的對DOM元素的操作以及相應的代碼示例&…

@RequestMapping path正則規范

RequestMapping 注解是 Spring MVC 中用于映射 HTTP 請求的注解之一。它可以用于處理各種 HTTP 請求&#xff0c;包括 GET、POST、PUT、DELETE 等&#xff0c;并且可以指定請求的路徑、請求方法、請求參數等信息。 在使用 RequestMapping 注解時&#xff0c;可以使用正則表達式…

51單片機入門:串口通信

串行通信的初步認識 通信方式分類 1、按照數據傳送方式&#xff1a; 并行通信&#xff1a;通信時數據的各個位同時傳送&#xff0c;可以實現字節為單位的通信。 但是通信線多&#xff0c;占用資源多&#xff0c;成本高。 串行通信&#xff1a;一次只能發送一位&#xff0c…

python把png轉成jpg

在Python中&#xff0c;你可以使用PIL&#xff08;Python Imaging Library&#xff0c;也稱為Pillow&#xff09;庫來讀取PNG圖片并將其轉換為JPG格式。下面是一個簡單的示例代碼&#xff1a; from PIL import Image# 打開PNG圖片 png_image Image.open(input.png)# 保存為JP…

微軟exchange郵箱發送

使用java發送exchange類型的郵件&#xff0c;foxmail中配置如下圖&#xff1a; 需要的maven依賴如下&#xff1a; <dependency><groupId>com.microsoft.ews-java-api</groupId><artifactId>ews-java-api</artifactId><version>2.0</ve…

PCIE協議-2-事務層規范-Message Request Rules

2.2.8 消息請求規則 本文檔定義了以下幾組消息&#xff1a; INTx 中斷信號電源管理錯誤信號鎖定事務支持插槽電源限制支持廠商定義消息延遲容忍度報告&#xff08;LTR&#xff09;消息優化緩沖區沖洗/填充&#xff08;OBFF&#xff09;消息設備就緒狀態&#xff08;DRS&#…

【系統架構師】-案例篇(八)數據流圖

數據流&#xff1a;數據流是系統中數據的流動&#xff0c;它可以是輸入、輸出或存儲在系統中的數據。 數據處理過程&#xff1a;數據處理過程是對數據進行處理的單元&#xff0c;可以是一個物理設備或軟件模塊。 數據存儲&#xff1a;數據存儲是系統中存儲數據的單元&#xff0…

焦作定制在線教育系統上線,小學英語教案怎么寫?教案要怎么下筆?

說到小學英語這也是當前&#xff0c;學生們的重點&#xff0c;那作為配套的輔導機構&#xff0c;要怎么寫教案?這也是需要關注的地方&#xff0c;因為教案關系著教學&#xff0c;有了它學生們上課才會更有效率&#xff0c;所以&#xff0c;會寫教案也是上課的第一步。 教案要怎…

小紅書·電商運營課:小紅書開店流程,小紅書電商如何運營(18節視頻課)

課程目錄 第1節課:學習流程以及后續實操流程注意事項 第2節課:小紅書店鋪類型解析以及開店細節 第3節課:小紅書電商運營兩種玩法之多品店鋪解析 第4節課:小紅書電商運營兩種玩法之單品店鋪解析 第5節課:選品課(多品類類目推薦) 第6節課:選品課(多品類類目推薦) 第7節課:…

百度GL地圖實現某一段路的路況(new BMapGL.DrivingRouteLine)

功能描述&#xff1a; 1.百度地圖實現點擊地圖出現起點&#xff0c;再次點擊出現終點&#xff08;起點終點能拖動&#xff09;繪制完終點后獲取該路的路況并且起點和終點可以拖動實現實時更新&#xff08;新繪制的路段的&#xff09;路況 2.地點搜索 效果如下&#xff1a; 關鍵…

Springboot+Vue項目-基于Java+MySQL的制造裝備物聯及生產管理ERP系統(附源碼+演示視頻+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;Java畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計 &…

Web自動化-日志收集

目標 1. 理解日志的相關概念 2. 掌握日志的基本用法 3. 掌握日志的高級用法 一、日志相關概念 目標 1. 了解日志的概念 2. 理解日志的作用 3. 掌握常見的日志級別 1. 日志 概念&#xff1a;日志就是用于記錄系統運行時的信息&#xff0c;對一個事件的記錄&#xff1b…

ffmpeg解析rtsp流獲取視頻的寬高

要使用FFmpeg來解析RTSP流并獲取視頻的寬度和高度,你可以使用avformat_find_stream_info函數來獲取流的信息,然后從AVStream結構體中讀取視頻的寬度和高度。以下是一個簡單的示例代碼: #include <libavformat/avformat.h> int main(int argc, char *argv[]) {AVForm…

ppt轉pdf的java實現

一、實現方式 java采用jacob包的功能&#xff0c;把ppt演示文稿轉換為pdf。 支持文件格式&#xff1a;pptx,ppt 二、事先準備 1、依賴于office&#xff0c;需安裝office辦公軟件 2、需要下載一個jacob-1.20-x64.dll的文件&#xff0c;放到java的bin目錄下。 文件可以網上搜…

電影網站|基于SSM+vue的電影網站系統(源碼+數據庫+文檔)

電影網站 目錄 基于SSMvue的電影網站系統 一、前言 二、系統設計 三、系統功能設計 1 系統功能模塊 2 管理員功能模塊 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&#xff1a; 博主介紹&#xff1a;??大廠碼農|畢設布道…