Android入門(九)| 滾動控件 ListView 與 RecyclerView

文章目錄

  • ListView
    • 內置類型的簡單運用
    • 定制數據類型
    • 提升效率
    • 點擊事件
  • RecyclerView
    • 布局管理器
    • 點擊事件


ListView

內置類型的簡單運用

由于手機屏幕空間有限,能夠一次性在屏幕上顯示的內容不多,當我們的程序有大量數據需要顯示的時候就可以借助 ListView 來實現。

布局文件 listview_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent" /></androidx.constraintlayout.widget.ConstraintLayout>

活動文件 ListViewTest.java

public class ListViewTest extends AppCompatActivity {private String[] data = {"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry", "Mango","Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango"};// 數據無法直接傳遞給 ListView@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.listview_layout);ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);// 借助適配器傳遞數據ListView listView = (ListView)findViewById(R.id.list_view);listView.setAdapter(adapter);}
}
  • ListView 子項布局的 idandroid.R.layout.simple_list_item_1 ,其是一個 Android 內置的布局文件,內容只有一個 TextView,可以用于簡單地顯示一段文本。
  • ArrayAdapter 構造函數
    1. 參數一:當前 Context
    2. 參數二:ListView 子項布局的 id,此例中為上面提到的 TextView
    3. 參數三:適配布局的數據

運行結果:

在這里插入圖片描述


定制數據類型

如果想要每個水果的名字都對應一張圖片,那么內置的 String 類型就無法滿足需求了,因此需要自定義一個 Fruit 類:

package com.example.activitytest;public class Fruit {private String name;private int imageId;public Fruit(String name, int imageId){this.name = name;this.imageId = imageId;}public String getName(){return name;}public int getImageId(){return imageId;}
}

ListView 的子項指定一個自定義布局,在 layout 目錄下新建 fruit_item.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/fruit_image"android:layout_width="300dp"android:layout_height="200dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.0" /><TextViewandroid:id="@+id/fruit_name"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="@+id/fruit_image"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/fruit_image" /></androidx.constraintlayout.widget.ConstraintLayout>
  • ImageView:顯示圖片。
  • TextView :顯式名稱,文字居中。

接下來參考書上的內容創建一個自定義適配器:

public class FruitAdapter extends ArrayAdapter<Fruit> {private List<Fruit> fruitList; // 數據private int resourceId; // 子項xml布局文件public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects){super(context, textViewResourceId, objects);resourceId = textViewResourceId;fruitList = objects;}// 重寫getView方法,加載每個處于屏幕內的子項時調用public View getView(int position, View convertView, ViewGroup parent){Fruit fruit = getItem(position); // 獲取當前的 Fruit 實例,還有一種寫法:fruitList.get(position),從list中獲取單個節點元素View view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);fruitImage.setImageResource(fruit.getImageId());TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);fruitName.setText(fruitList.get(position).getName());return view;}
}

構造函數 FruitAdapter 本質上還是雷同于被它 extendsArrayAdapter構造函數,參數分析:

  • context:指定當前上下文。
  • textViewResourceIdListView 子項布局的 id
  • objects:適配布局的數據

加載每個處于屏幕內的子項時調用的 getView,由于我們是重寫已有函數,因此參數是固定的:

  • position:當前 Item 在屏幕中的位置,通常搭配 getItem() 返回一個子View以獲取當前實例。
  • convertView:緩存視圖 View,如果非null,則直接再次對 convertView 復用,否則才創建新的 View。
  • parent:Item 的 View 的父視圖,用處的話私以為就是為了充當 inflate 的第二個參數。

LayoutInflater 是根據 Layout XML文件 來生成 對應 View 對象 的系統服務。一般用它之作一件事: inflate(加載布局)。

inflate 方法:

public View inflate (int resource, ViewGroup root, boolean attachToRoot) 
  • resource:要加載的布局對應的資源 id
  • root:在參數一對應布局外部嵌套一個父布局,如果不需要則為 null。
  • attachToRoot:是否為加載的布局添加一個 root 的外層容器
    1. 為 true 時將子布局添加到父布局中并保存子布局的 layout 配置
    2. 為 false 時表示只讓在子布局中聲明的 layout 屬性生效,但不將子布局添加到父布局中,此時想要將子布局添加到父布局中需要調用 addView() 方法。

上述代碼中參數三就被賦值為 false,這是因為 ListView 繼承自 AdapterView,繼承了 AdapterView 的控件是不支持 AddView() 方法的,因為一旦 resource 對應的 View 有了父布局,就不能再被添加到 ListView 中了。而參數三為 true 時會自動調用 AddView() 方法(關于inflate參數的相關信息詳見本文)。

// We are supposed to attach all the views we found (int temp)
// to root. Do that now.
if (root != null && attachToRoot) { // attachToRoot 為 true 時自動調用 addView 方法root.addView(temp, params);
}

在這里插入圖片描述

關于 LayoutInflater 與 inflate 可參考本文。

設置顯示的圖片和文字

  • 通過 findViewById 方法分別獲取到 ImagViewTextView 的實例
  • 分別調用它們的 setImageResourcesetText 方法來設置顯示的圖片和文字
  • 最后將布局返回

最后修改活動文件 ListViewTest.java ,以自定義適配器為 extends ArrayAdapter<Fruit> 的情況為例:

public class ListViewTest extends AppCompatActivity {private List<Fruit> fruitList = new ArrayList<>();@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.listview_layout);initFruits(); // 初始化數據集// 借助適配器傳遞數據FruitAdapter adapter = new FruitAdapter(this, R.layout.fruit_item, fruitList);// FruitAdapter adapter = new FruitAdapter(this, fruitList);ListView listView = (ListView)findViewById(R.id.list_view);listView.setAdapter(adapter);}private void initFruits(){Fruit apple = new Fruit("Apple", R.drawable.ic_launcher_background);fruitList.add(apple);Fruit banana = new Fruit("Banana", R.drawable.ic_launcher_foreground);fruitList.add(banana);Fruit orange = new Fruit("Orange", R.drawable.cmy1);fruitList.add(orange);Fruit Watermelon = new Fruit("Watermelon", R.drawable.cmy2);fruitList.add(Watermelon);Fruit pear = new Fruit("Pear", R.drawable.cmy3);fruitList.add(pear);Fruit grape = new Fruit("Grape", R.drawable.cmy4);fruitList.add(grape);}
}

提升效率

  • FruitAdaptergetView 方法中每次都通過 LayoutInflaterinflate 將布局重新加載了一遍, 當 ListView 快速滾動的時候就會成為性能的瓶頸。而之前提到 getView 方法中的 convertView 參數可以緩存 View,因此可以利用該參數來提高效率。
  • getView 方法中我們每次都要通過 findViewById 方法創建控件 fruit_imagefruit_name 的實例。不如用一個 內部類ViewHolder 來對控件實例進行緩存。
	public View getView(int position, View convertView, ViewGroup parent){Fruit fruit = (Fruit) getItem(position);ViewHolder viewHolder;if(convertView == null){convertView = LayoutInflater.from(context).inflate(resourceId, parent, false);viewHolder = new ViewHolder();viewHolder.fruitImage = convertView.findViewById(R.id.fruit_image);viewHolder.fruitName = convertView.findViewById(R.id.fruit_name);convertView.setTag(viewHolder);}else{viewHolder = (ViewHolder) convertView.getTag();}viewHolder.fruitImage.setImageResource(fruit.getImageId());viewHolder.fruitName.setText(fruit.getName());return convertView;}class ViewHolder{ImageView fruitImage;TextView fruitName;}

總而言之,之前每次加載屏幕外的 子項 時都需要進行前文提到的兩種操作,但在進行改進之后,只有第一次加載(比如往下滑屏幕)的時候執行 convertView == null 的代碼才需進行前文的兩項操作,之后加載時(比如滑到底了再往上滑)就是 convertView 非空的情況了。


點擊事件

滾動只是視覺效果,子項還可以點擊。修改活動文件 ListViewTest.java

    protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.listview_layout);initFruits();FruitAdapter adapter = new FruitAdapter(this, R.layout.fruit_item, fruitList);// FruitAdapter adapter = new FruitAdapter(this, fruitList);// 借助適配器傳遞數據ListView listView = (ListView)findViewById(R.id.list_view);listView.setAdapter(adapter);listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Fruit fruit = fruitList.get(position);Toast.makeText(ListViewTest.this, fruit.getName(), Toast.LENGTH_SHORT).show();}});/* lambda表達式代替內聯函數listView.setOnItemClickListener((AdapterView<?> parent, View view, int position, long id)->{Fruit fruit = fruitList.get(position);Toast.makeText(ListViewTest.this, fruit.getName(), Toast.LENGTH_SHORT).show();});*/}
  • 使用 setOnItemClickListener 方法為 ListView 注冊了一個監聽器
  • 點擊任何一個子項時回調 onItemClick 方法,通過 position 參數獲得點擊的是哪一個子項
  • 獲取相應 Fruit 名稱并通過 Toast 輸出

RecyclerView

布局管理器

ListView性能容易變差、數據只能縱向滾動 的缺點。而 RecyclerView 就支持橫向滾動。

為了讓所有 Android 版本都能使用,RecyclerView 被定義在 support 庫中。因此,需要使用前要在項目的 build.gradle 文件中添加相應依賴庫:
在這里插入圖片描述

修改布局文件 listview_layout.xml 中控件 ListViewRecyclerView,并修改布局文件名稱為 recyclerview_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"/></androidx.constraintlayout.widget.ConstraintLayout>

子項布局文件 fruit_item.xml 和自定義的 Fruit 類無需修改,但適配器 FruitAdapter 類需要重新實現,原本 getView 方法的職責被三個方法替代:

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {private List<Fruit> FruitList;// 構造函數public FruitAdapter(List<Fruit> fruitList){FruitList = fruitList;}// 三個繼承自父類的函數// 創建內部類實例@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);return new ViewHolder(view);}// 將獲得的Fruit實例作為RecyclerView子項控件的值@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {Fruit fruit = FruitList.get(position); // 獲得子項holder.fruitImage.setImageResource(fruit.getImageId());holder.fruitName.setText(fruit.getName());}// 統計子項數目@Overridepublic int getItemCount() {return FruitList == null ? 0 : FruitList.size();}// 緩存Fruit屬性對應控件的內部類static class ViewHolder extends RecyclerView.ViewHolder{ImageView fruitImage;TextView fruitName;public ViewHolder(@NonNull View itemView) {super(itemView);fruitImage = itemView.findViewById(R.id.fruit_image);fruitName = itemView.findViewById(R.id.fruit_name);}}
}

活動文件 ListViewTest.java

public class ListViewTest extends AppCompatActivity {private List<Fruit> fruitList = new ArrayList<>();@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.recyclerview_layout);initFruits();RecyclerView recyclerView = findViewById(R.id.recycler_view);// 指定RecyclerView布局方式為線性布局LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);recyclerView.setLayoutManager(linearLayoutManager);// 設置適配器recyclerView.setAdapter(new FruitAdapter(fruitList));}private void initFruits(){for(int i = 0; i < 10; i++){Fruit fruit = new Fruit("apple", R.drawable.cmy1);fruitList.add(fruit);}}
}

與 ListView 不同的是,需要傳入一個布局管理器 LinearLayoutManager 來規定 RecyclerView 是何種布局,一般有三種:

  • GridLayoutManager:網格布局
  • LinearLayoutManager:線性布局
  • StaggeredGridLayoutManager:瀑布流布局

這里以瀑布流布局為例:

StaggeredGridLayoutManager layoutManager = newStaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);// 表示會把布局分為三列,并縱向排列
recyclerView.setLayoutManager(layoutManager);

運行結果:
在這里插入圖片描述
這里看起來像網格布局是因為每個子項的長寬是一樣的,當長寬不一樣時就會呈現這樣的效果:
在這里插入圖片描述

此外,還可實現橫向滾動:

    protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.recyclerview_layout);initFruits();RecyclerView recyclerView = findViewById(R.id.recycler_view);// 指定RecyclerView布局方式為線性布局LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);// 布局橫向排列以便橫向滾動linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);recyclerView.setLayoutManager(linearLayoutManager);// 設置適配器recyclerView.setAdapter(new FruitAdapter(fruitList));}

點擊事件

不同于 ListView,RecyclerView 沒有類似于 setOnItemClickListener 這樣的注冊監聽器方法,這需要給子項具體的 View 注冊點擊事件。

修改適配器類 FruitAdapter.javaonCreateViewHolder 函數,實現點擊 Fruit 子項的文字部分會彈出 Toast 文本;點擊 Fruit 子項的圖片部分會顯示大圖:

public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);final ViewHolder holder = new ViewHolder(view);holder.itemView.setOnClickListener((View v)->{Toast.makeText(v.getContext(), "clicked view", Toast.LENGTH_SHORT).show();});holder.fruitImage.setOnClickListener((View v)->{// 獲取當前子項實例int position = holder.getAdapterPosition();Fruit fruit = FruitList.get(position);// 使用Dialog顯示大圖final Dialog dialog = new Dialog(v.getContext());// 設置緩存圖片的ImageView控件ImageView img = new ImageView(v.getContext());// 用當前Fruit實例的成員(圖片id)為img控件賦值img.setImageResource(fruit.getImageId());/* 也可以不使用position一連串操作,而是通過setImageDrawable將holder.fruitImage的圖片顯示到img中img.setImageDrawable(holder.fruitImage.getDrawable());*/// 設置dialog彈出內容dialog.setContentView(img);// 對話框背景為透明dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);// 顯示dialogdialog.show();// 點擊圖片取消img.setOnClickListener((View vi)->{dialog.cancel();});});return holder;}

點擊圖片的運行結果:
在這里插入圖片描述

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

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

相關文章

關于“三門問題”的一些想法

三門問題&#xff08;Monty Hall problem&#xff09;亦稱為蒙提霍爾問題、蒙特霍問題或蒙提霍爾悖論&#xff0c;大致出自美國的電視游戲節目Let’s Make a Deal。問題名字來自該節目的主持人蒙提霍爾&#xff08;Monty Hall&#xff09;。參賽者會看見三扇關閉了的門&#xf…

Android入門(10)| Fragment碎片詳解

文章目錄為什么要使用碎片&#xff08;Fragment&#xff09;實例布局文件FragmentActivity動態添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期為什么要使用碎片&#xff08;Fragment&#xff09; 我們在手機上看新聞可能是這樣的&#xff1a; Re…

Android開發(1) | Fragment 的應用——新聞應用

文章目錄Item&#xff1a;標題子項布局文件Java代碼標題碎片布局文件Java代碼新聞內容碎片布局文件Java代碼新聞內容活動布局文件Java代碼首界面布局文件Java代碼Item&#xff1a;標題子項 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Java Web整體異常處理

在實際的J2EE項目中&#xff0c;系統內部難免會出現一些異常&#xff0c;就如StrutsSpringHibernate項目&#xff1a;通常一個頁面請求到達后臺以后&#xff0c;首先是到action&#xff08;就是MVC中的controller&#xff09;&#xff0c;在action層會調用業務邏輯層service&am…

Android入門(11)| 全局廣播與本地廣播

文章目錄廣播概念接收廣播動態注冊實例靜態注冊實例發送廣播發送標準廣播廣播的跨進程特性發送有序廣播本地廣播廣播概念 Android 中的每個應用程序都可以對自己感興趣的廣播進行注冊&#xff0c;這樣該程序就只會接收到自己所關心的廣播內容&#xff0c;這些廣播可能是來自系…

Android開發(2) | 廣播 Broadcast 的應用——強制下線功能

文章目錄功能簡介關閉所有活動登陸界面發送強制下線的廣播廣播接收器AndroidManifest.xml運行結果功能簡介 強制下線功能只需要彈出一個對話框&#xff0c;讓用戶只能點擊確定按鈕&#xff0c;回到登錄界面。 如果在每一個活動中添加一個對話框的話太過繁瑣&#xff0c;用廣播…

Android入門(12)| 數據持久化

文章目錄數據持久化文件存儲將數據存儲進文件實例從文件中讀取數據實例SharedPreferences存儲將數據存儲進文件實例從文件中讀取數據實例實現記住密碼的功能SQLite數據庫存儲創建自己的幫助類調用自己的幫助類補全 onUpgrade() 方法增刪查改增&#xff1a;SQLiteDatabase.inser…

Android入門(13)| Android權限 與 內容提供器

文章目錄普通權限與危險權限運行時申請權限內容提供器運用安卓封裝好的內容提供器自實現的內容提供器概念實現普通權限與危險權限 主要用于不同應用程序之間在保證被訪數據的安全性的基礎上&#xff0c;實現數據共享的功能。 在 Android 6.0 開始引入了運行時權限的功能&…

Java實現身份證號碼的驗證,JAVA后臺驗證身份證號碼

代碼如下&#xff1a; package cn.gov.csrc.util;/*** 18 位身份證驗證器* * author admin* */ public class IDCard {final int[] wi { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };final int[] vi { 1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2 };private int[] ai n…

Android入門(14)| 通知

文章目錄創建通知點擊效果其它小功能實例創建通知 創建通知的步驟&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通過當前 Context 的 getSystemService() 獲取實例。它接受一個字符串參數用于確定獲取系統的什么服務。Android 8.0(O) 版本后需要通知通道&…

Android開發(3) | 權限和內容提供器的應用——調用相機和相冊

文章目錄拍照并保存到 ImageView 控件布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作隱式 Intent 啟動后的回調AndroidManifest.xml從相冊選取照片并在 ImageView 控件中顯示布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作自定義打開相冊的方法 op…

Android開發(4) | 系統權限、MediaPlayer類 和 VideoView類 的應用——播放多媒體文件

文章目錄MediaPlayer類播放音頻的實例VideoView類播放視頻的實例MediaPlayer類 對多種格式的音頻文件提供了全面的控制方法&#xff1a; 如何獲得MediaPlayer實例&#xff1f; 通過構造函數&#xff1a; MediaPlayer mp new MediaPlayer();調用 MediaPlayer.create() 方法&…

Android入門(15)| 網絡

文章目錄WebViewHTTP使用HttpURLConnection使用OkHttp封裝網絡操作封裝HttpURLConnection封裝OkHttpWebView WebView 可以在 應用程序中&#xff08;而不是瀏覽器&#xff09; 展示一些網頁。 布局文件 web_layout.xml&#xff1a; <LinearLayoutxmlns:android"http…

Java-單例模式

單例模式相信大家都不陌生&#xff0c;在JAVAEE應用中&#xff0c;單例模式是一種應用非常廣泛的設計模式&#xff0c;應用中許多組件都只需要單個實例&#xff0c;下面介紹單例模式。 使用單例模式的優點&#xff1a; 1.減少創建JAVA實例所帶來的系統開銷。 2.便于系統跟蹤單…

Android入門(16)| 服務

文章目錄概念Android 多線程繼承 Thread繼承 Runable 接口匿名類異步消息處理AsyncTask使用服務框架啟動/停止服務綁定/解綁服務服務的生命周期前臺服務IntentService完整版下載示例下載過程的回調接口&#xff1a;DownloadListener繼承 AsyncTask 實現下載功能&#xff1a;Dow…

2020德勤面試開始了嗎_2020國考面試開始,近期面試公告匯總,附結構化小組面試流程...

2020年國家公務員考試面試環節逐步恢復考試&#xff0c;各個招錄部門已經發布面試考察公告&#xff0c;對于進入面試環節的國考考生來說&#xff0c;有必要了解近期國考面試的招錄動態&#xff0c;提前做好面試準備。2020國考國家統計局機關面試面試確認&#xff1a;請進入面試…

項目積壓需求項目計劃_需求變更頻繁,項目經理如何做好需求管理?

項目實施過程中&#xff0c;項目經理常常面臨一個重大挑戰——需求變更。需求變更無處不在&#xff0c;市場條件變化、新業務出現、戰略目標調整、客戶需求修改、資源限制等&#xff0c;都會造成需求變更。需求變更會影響項目的時間、成本和質量&#xff0c;對整個項目和團隊成…

Android | Sensor.TYPE_ORIENTATION被廢棄后的解決辦法

文章目錄概述getOrientation 方法根據 旋轉矩陣R 獲取 設備旋轉弧度getRotationMatrix 方法根據 地磁場、加速度傳感器對象 獲取 旋轉矩陣R代碼參考資料概述 Sensor.TYPE_ORIENTATION 常數在 API 8 中已棄用&#xff0c;官方推薦使用 SensorManager.getOrientation() 替代。關…

【JAVA 開發小問題】 | String操作合集

文章目錄截取特定兩個字符之間的字符串截取特定兩個字符之間的字符串 利用正則表達式&#xff0c;圖片來源

uniapp 刷新后數據都沒有了_環境溫度傳感器都沒有連接,竟然還會有數據?

福田歐曼GTL(福康發動機、康明斯2880系統)匹配ECoffit尿素泵●故障現象&#xff1a;OBD故障燈點亮&#xff0c;不燒尿素&#xff0c;油耗高&#xff0c;動力不足●故障碼&#xff1a;●維修分析&#xff1a;①故障指出加熱器問題&#xff0c;摸下尿素箱溫度&#xff0c;發現燙手…