最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Android位置權(quán)限以及數(shù)組尋找索引的坑

 更新時間:2018年07月27日 08:54:59   投稿:laozhang  
這篇文章給大家分享了Android位置權(quán)限以及數(shù)組尋找索引的坑的相關(guān)知識點內(nèi)容,有興趣的朋友可以參考學(xué)習(xí)下。

一、Android 危險權(quán)限,來自官方文檔的坑

Android開發(fā)者都知道,Android 6.0 之前,權(quán)限申請只需要在 AndroidManifest.xml 文件中聲明就可以。Android 6.0 開始,權(quán)限申請發(fā)生了變化,危險權(quán)限需要在應(yīng)用中動態(tài)申請,之前寫過一篇 Android 動態(tài)申請危險權(quán)限的筆記,詳情參考: Android 6.0 動態(tài)申請危險權(quán)限。

先截個圖,看看Android官方的說明:

再看危險權(quán)限的分組情況:

意思是,對危險權(quán)限進行了分組,同一組中,只要有有一個權(quán)限被授權(quán)了,同組中其它權(quán)限也就默認(rèn)授權(quán)了。比如,我授權(quán)應(yīng)用有讀存儲卡的權(quán)限之后,應(yīng)用也就有了寫存儲卡的權(quán)限,事實上也確實如此。
然而問題來了,利用 GPS 獲取位置信息的代碼:

LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
 if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
  != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission
  (MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)
  != PackageManager.PERMISSION_GRANTED){
 // request permissions
 // ...
 // ...
 }else{  
 Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER;
 if(location != null){ 
  double latitude = location.getLatitude(); 
  double longitude = location.getLongitude(); 
 } 
 }
}

通過官方的危險權(quán)限組,我們也能看到:Location 權(quán)限組里包含:ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 兩個權(quán)限,按照上面的說明,兩個權(quán)限只要有一個申請授權(quán)成功,即可成功獲取經(jīng)緯度。——然鵝,當(dāng)成功申請了 ACCESS_COARSE_LOCATION 權(quán)限后,程序依然會崩,錯誤信息提示,需要獲得 ACCESS_FINE_LOCATION 權(quán)限 。

二、Spinner 的 setSelection() 方法,源于自己想當(dāng)然的坑

Android 中的下拉列表控件 spinner 有一個方法 setSelection(int position) ,顯示第幾項。此方法可能沒有效果???總是顯示第一項???

當(dāng)在做兩個spinner聯(lián)動時,spinner2依據(jù)spinner1的選擇填充數(shù)據(jù),然后使用setSeletion(2)來設(shè)置默認(rèn)項。結(jié)果發(fā)現(xiàn):spinner2顯示的總是第一項,但是實際選擇的確實已經(jīng)是position 2的位置 。
解決方法:

舊代碼:

spinner.setAdapter(adapter);
  spinner.setSelection(2);

解決方案有二:

(1)

spinner.setAdapter(adapter);
  spinner.setSelection(2,true); //spinner會重新layout

(2) 推薦

 spinner.setAdapter(adapter);![](https://images2018.cnblogs.com/blog/758949/201807/758949-20180726224508174-131546620.jpg)

  adapter.notifyDataSetChanged(); //通知spinner刷新數(shù)據(jù)
 spinner.setSelection(2);

那么,這到底是什么原因造成的?我認(rèn)為這是一個bug 。這種情況通常發(fā)生在重新填充數(shù)據(jù)之后,除此之外,使用setSelection(int position)都能得到正確的顯示。

setSelection(int position, boolean animate)和setSelection(int position) 實現(xiàn)機制有較大區(qū)別,當(dāng)調(diào)用前者時重新layout,立即觸發(fā)onItemSelected函數(shù),作用相當(dāng)于用手直接點擊。而后者設(shè)置了下次選擇位置:setNextSelectedPositionInt(position); 然后請求Layout;,而requestLayout并非立即執(zhí)行,僅僅是一個schedule。但是后者可能在重新裝載數(shù)據(jù)然后Layout時丟失了某些狀態(tài)。

然鵝,我要說的坑不是這樣,我沒有兩個 Spinner 聯(lián)動,我出現(xiàn)的問題是這樣的,上代碼

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.example.sharpcj.helloworld.MainActivity">

 <Spinner
  android:id="@+id/sp_test"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true">

 </Spinner>

</RelativeLayout>

java 代碼:

package com.example.sharpcj.helloworld;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

import java.util.Arrays;

public class MainActivity extends AppCompatActivity {

 private Spinner mSpTest;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  String[] strs = new String[20];
  for (int i = 0; i < strs.length; i++) {
   strs[i] = "第" + i + "項";
  }
  mSpTest = findViewById(R.id.sp_test);
  mSpTest.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, strs));

  int index = Arrays.binarySearch(strs, "第11項");
  mSpTest.setSelection(index);
 }
}

運行結(jié)果:

what???
為什么會這樣呢? spinner 表示這個鍋它不背,其實這個坑怪我自己想當(dāng)然了,原因在于錯誤地使用了 Arrays.binarySearch(Object[] a , Object key) 這個方法,想當(dāng)然地認(rèn)為了返回值為查找到數(shù)組的 index。代碼中, index 的實際值是 -2 。

網(wǎng)上找了一下資料:

binarySearch(int[] a, int key) 此方法的規(guī)則是這樣的:

1、如果找到關(guān)鍵字,則返回值為關(guān)鍵字在數(shù)組中的位置索引,且索引從0開始

2、如果沒有找到關(guān)鍵字,返回值為負(fù)的插入點值,所謂插入點值就是第一個比關(guān)鍵字大的元素在數(shù)組中的位置索引,而且這個位置索引從1開始。

而binarySearch(Object[] a, Object key) 最終調(diào)用方法的源碼如下:

 // Like public version, but without range checks.
 private static int binarySearch0(Object[] a, int fromIndex, int toIndex,
          Object key) {
  int low = fromIndex;
  int high = toIndex - 1;

  while (low <= high) {
   int mid = (low + high) >>> 1;
   @SuppressWarnings("rawtypes")
   Comparable midVal = (Comparable)a[mid];
   @SuppressWarnings("unchecked")
   int cmp = midVal.compareTo(key);

   if (cmp < 0)
    low = mid + 1;
   else if (cmp > 0)
    high = mid - 1;
   else
    return mid; // key found
  }
  return -(low + 1); // key not found.
 }

關(guān)于 Object 類型,Oracle 大神寫的這個二分法尋找索引的代碼暫時沒看懂。

相關(guān)文章

  • Android實現(xiàn)動態(tài)高斯模糊背景效果

    Android實現(xiàn)動態(tài)高斯模糊背景效果

    在現(xiàn)代 Android UI 中,動態(tài)高斯模糊背景 常見于對話框或彈窗后面的模糊遮罩,相比靜態(tài)模糊圖,動態(tài)模糊可隨著內(nèi)容滾動或變化實時更新,使界面更具層次感與沉浸感,所以本文給大家介紹了Android實現(xiàn)動態(tài)高斯模糊背景效果,需要的朋友可以參考下
    2025-04-04
  • 基于Android studio3.6的JNI教程之opencv實例詳解

    基于Android studio3.6的JNI教程之opencv實例詳解

    這篇文章主要介紹了基于Android studio3.6的JNI教程之opencv實例詳解,本文通過實例代碼截圖的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Android編程出現(xiàn)Button點擊事件無效的解決方法示例

    Android編程出現(xiàn)Button點擊事件無效的解決方法示例

    這篇文章主要介紹了Android編程出現(xiàn)Button點擊事件無效的解決方法,結(jié)合實例形式分析了Android編程中出現(xiàn)Button點擊事件無效的原因及相關(guān)的解決方法,需要的朋友可以參考下
    2018-02-02
  • Android仿微博加載長圖滾動查看效果

    Android仿微博加載長圖滾動查看效果

    這篇文章主要為大家詳細(xì)介紹了Android仿微博加載長圖滾動查看效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android?WebView升級詳細(xì)操作指南

    Android?WebView升級詳細(xì)操作指南

    Android的WebView差異化很嚴(yán)重,下面這篇文章主要給大家介紹了關(guān)于Android?WebView升級的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-07-07
  • Android fragment 轉(zhuǎn)場動畫創(chuàng)建步驟

    Android fragment 轉(zhuǎn)場動畫創(chuàng)建步驟

    在 Android 中,可以使用 setCustomAnimations() 方法來繪制自定義的 Fragment 轉(zhuǎn)場動畫,本文分步驟給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Java中的Struts2框架攔截器之實例代碼

    Java中的Struts2框架攔截器之實例代碼

    本篇文章主要介紹了Java的Struts2框架攔截器實例的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android編程實現(xiàn)自定義title功能示例

    Android編程實現(xiàn)自定義title功能示例

    這篇文章主要介紹了Android編程實現(xiàn)自定義title功能,結(jié)合具體實例形式分析了Android自定義title的具體實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-03-03
  • Android自定義控件實現(xiàn)簡單的輪播圖控件

    Android自定義控件實現(xiàn)簡單的輪播圖控件

    這篇文章主要介紹了Android自定義控件實現(xiàn)簡單的輪播圖控件的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Android線程池源碼閱讀記錄介紹

    Android線程池源碼閱讀記錄介紹

    大家好,本篇文章主要講的是Android線程池源碼閱讀記錄介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評論

富裕县| 清水县| 中卫市| 珠海市| 墨脱县| 建水县| 宝坻区| 东平县| 灯塔市| 杭锦旗| 宜城市| 资源县| 大同市| 铅山县| 河北区| 读书| 天峨县| 兴安盟| 册亨县| 马山县| 宁城县| 大新县| 合山市| 都安| 新泰市| 古丈县| 宝鸡市| 丽水市| 奈曼旗| 伊宁市| 玛曲县| 吉隆县| 濮阳县| 宣武区| 河源市| 金湖县| 元谋县| 宜都市| 汉沽区| 柳州市| 高雄市|