這里我先公布下答案:不需要
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),平遙企業(yè)網(wǎng)站建設(shè),平遙品牌網(wǎng)站建設(shè),網(wǎng)站定制,平遙網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,平遙網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
我要實現(xiàn)讀取已安裝應(yīng)用列表功能,Google了一下,可以通過PackageManager.getInstalledPackages()方法獲取,我手頭有三臺手機,分別是華為Nexus 5X、Meta9、Vivo X20,寫了個Demo在這三個手機上進行測試,測試結(jié)果如下:
我沒有申請任何權(quán)限,Vivo X20為什么會出現(xiàn)申請讀取已安裝應(yīng)用列表權(quán)限對話框呢?為什么是有時候能獲取到全部已安裝應(yīng)用列表,有時候獲取不到?
Google一下,看有沒有和我類似的問題,找到了一篇:
Android 如何完整的獲取到用戶已安裝應(yīng)用列表
這篇文章中,作者有個結(jié)論:『國內(nèi)部分廠商比如華為、oppo,他們將”獲取用戶已安裝應(yīng)用列表”的權(quán)限暴露給了用戶,讓用戶可以自由決定允許或者禁止應(yīng)用訪問該信息?!?/p>
Nexus 5X中沒有找到讀取已安裝應(yīng)用列表權(quán)限。
這里有提到華為,我打開meta 9的權(quán)限列表看了一下有讀取已安裝應(yīng)用列表權(quán)限,我的Demo對應(yīng)的這個權(quán)限默認是打開的,所以meta 9是能獲取到全部已安裝應(yīng)用列表。
再看下Vivo X20,在打開Demo的時候彈出申請權(quán)限對話框了,說明Vivo也屬于那部分國內(nèi)廠商,由于在彈出申請讀取已安裝應(yīng)用列表權(quán)限對話框時,我允許了,所以打開Vivo X20的讀取已安裝應(yīng)用列表權(quán)限時,這里的狀態(tài)是打開的,但是,點進去一看,暗藏玄機,這里還有一個 安全等級,分為高、中、低 ,我的Demo屬于高,看看其他應(yīng)用呢?微信安全等級屬于低、支付寶屬于低,讀取不到應(yīng)用列表難道和這個 安全等級 有關(guān)系嗎?
我手動將我的Demo的 安全等級 調(diào)整為低,再打開Demo,奇跡發(fā)生了,沒有彈出申請讀取已安裝應(yīng)用列表權(quán)限對話框,并且獲取到了全部已安裝應(yīng)用列表。
Android 讀取已安裝應(yīng)用列表不需要申請權(quán)限,因為Android權(quán)限列表中沒有權(quán)限是用于讀取已安裝應(yīng)用列表的。
如果想要獲取Vivo X20這種有 安全等級 的手機中的已安裝應(yīng)用列表,由于這種 安全等級 我們無法決定,所以只能通過反向查找的方式,即通過包名能否找到應(yīng)用,從而判斷是否安裝了某應(yīng)用。
這種方法獲取不到全部已安裝應(yīng)用列表,只能獲取到指定的應(yīng)用。
如果有比較了解權(quán)限的同學(xué)覺得我有寫的不對的地方,或者對于獲取已安裝應(yīng)用列表有更好的方法,歡迎留言交流!
將課本的章節(jié)以多級列表的形式顯示。
1.嵌套多級 RecyclerView,兩級列表還好說,每多一級都是一場噩夢。
2.ExpandableListView?但是ExpandableListView只支持兩級,不滿足需求。
3.一個RecyclerView或者 ListView 來實現(xiàn),每一級節(jié)點的要素有:當(dāng)前節(jié)點id、父級節(jié)點id即pid,顯示的內(nèi)容。
控制父子之間聯(lián)動的選中與取消狀態(tài),只需調(diào)用setChecked方法既可,注意如果在setOnCheckedChangeListener中處理會有問題:因為如果要子節(jié)點/父節(jié)點選中或者取消需要刷新頁面,而刷新頁面又會觸發(fā)viewHolder.cb.setChecked(true/false);的判斷從而又會進入setOnCheckedChangeListener,會導(dǎo)致如果父節(jié)點選中某些子節(jié)點取消不了的情況。
通過一個ListView來展示所有數(shù)據(jù),每一級內(nèi)容的顯示根據(jù)當(dāng)前展示數(shù)據(jù)的等級縮進一定的padding值,讓我們看起來有縮進效果。
使用過程中感覺不是很舒服的地方在于最終用于顯示在界面實體Bean并不是我們傳進去的數(shù)據(jù),而是經(jīng)過轉(zhuǎn)化并且過濾的數(shù)據(jù),這樣最直接的影響就是在我新增數(shù)據(jù)的數(shù)據(jù)之后,拿著Adapter來刷新的時候,并沒有任何效果。因為我們沒有將后面新加的數(shù)據(jù)進行轉(zhuǎn)化。
而我們?nèi)绾文茉诓桓淖冊袛?shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上,添加我們的新內(nèi)容,并保持原有的選中或者展開正常呢?我的想法是這樣的,如果可以直接給它傳入轉(zhuǎn)化后的Node節(jié)點類型數(shù)據(jù)就好了,我想到了繼承,讓實體類去繼承基類Node,但一旦繼承Node則意味著實體類就不能再繼承其他類了,感覺不是很靈活,而且也影響了實體類本身的結(jié)構(gòu)。后來想到了包裝設(shè)計模式的一些東西,那我就在實體類外再包上一層,也就是將實體類傳給Node,最終我們使用的還是Node,但也可以用node.bean很輕松的取出實體類做其他操作,并且實體類本身的結(jié)構(gòu)并沒有被破壞。
在此基礎(chǔ)上,因為我們的Node不需要轉(zhuǎn)化重新創(chuàng)建,那么它就可以保存一些狀態(tài)比如展開、選中等等,而在新加入數(shù)據(jù)時只需標記下新加入的數(shù)據(jù),只需對新加入的數(shù)據(jù)進行初始化狀態(tài),已有老數(shù)據(jù)不進行狀態(tài)改變:
項目地址:
原文連接:
在UI中經(jīng)常會使用到下拉列表,在android控件中有兩個下拉列表控件:
在xml中添加控件的使用:
主題:
這些都沒有達到我要的效果:
android:entries // 傳入的是values文件夾下的arrayx.xml內(nèi)的數(shù)據(jù)
android:spinnerMode //顯示模式有popmenu和dialog兩種
android:prompt //當(dāng)顯示模式為dialog時生效,作用為顯示dialog的標題內(nèi)容