當前位置:首頁 » 安卓系統 » pressforandroid

pressforandroid

發布時間: 2023-04-20 03:20:24

⑴ Android Studio開發無法運行項目

是因為android的插件沒有安裝,需要安裝插件。

操作步驟:

  1. 在此界面點擊「file」選擇「settings」或清選項。

  2. 完成後重啟Android Studio即可。

⑵ 問答:Android P都更新了哪些功能

Android P的新功能特性集中在了UI、通知體驗、室內定位、圖像存儲幾個方面,解決了之前一直存在的痛點。例如WiFi RTT一定程度上彌補了蜂窩網路在室內環境下的定位問題,HEIC圖像格式則重點解決了存儲容量問題。同時,Android P也在通知豐富度及操作便捷性等功能方面有所增強和提升。

一、WiFi RTT功能——復雜地形精確導航

WiFi RTT功能是Android P新引入的一個功能,從原理上來說與蜂窩網路的定位原理一致,但這個功能極大的彌補了蜂窩網路在室內定位的短板,WiFi RTT將能夠在室內提供高精度的定位,這是蜂窩網路很難做到的。

WiFi RTT是全新的功能,在android.net.wifi包下增加了rtt包,用於存放WiFi RTT相關類和介面。

WiFi RTT的API以WifiRttManager為核心,藉助AP熱點或WiFi,利用RTT原理完成測距,通過三個以上的測距點就能夠准確地定位到設備所在位置。

WiFiRTTManager提供了測距介面,是一個非同步測距操作,根據官方文檔(https://developer.android.com/reference/android/net/wifi/rtt/WifiRttManager.html)說明,其測距介面如下:

void startRanging(RangingRequest request, RangingResultCallback callback, Handler handler);

註:SDK Platforms Android P Preview Revision 1的相關介面定義與此不同,但實際的官方鏡像中介面與此一致,開發者需要更新最新的Android P Preview Revision 2,此版本中Google已經修正該介面。

介面中,RangingRequest通過RangingRequest.Builder構建,RangingRequest.Builder構建出RangingRequest所需要的參數可以通過WiFiManager等系統服務獲取到相關的內容,如List<ScanResult> scanResults = wifiManager.getScanResults();

以下提供一個簡單的測試Demo,以供參考:

private WifiRttManager wifiRttManager;
private WifiManager wifiManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
// ... ...

if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)) {
Object service = this.getApplicationContext().getSystemService(Context.WIFI_RTT_RANGING_SERVICE);
if(service instanceof WifiRttManager) {
wifiRttManager= (WifiRttManager) service;
Log.i(TAG, "Get WifiRttManager Succ.");
}

wifiManager = (WifiManager) this.getApplicationContext().getSystemService(Context.WIFI_SERVICE);

IntentFilter wifiFileter = new IntentFilter();
wifiFileter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
wifiFileter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
wifiFileter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(new WifiChangeReceiver(), wifiFileter);
}

// ... ...


private void startScanAPs() {
wifiManager.setWifiEnabled(true);
wifiManager.startScan();
}

class WifiChangeReceiver extends BroadcastReceiver {
@RequiresApi(api = 28)
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
List<ScanResult> scanResults = wifiManager.getScanResults();
Log.i(TAG, "Wifi Scan size:" + scanResults.size());
for(ScanResult scanResult: scanResults) {
Log.i(TAG, scanResult.toString());
RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(scanResult);
wifiRttManager.startRanging(builder.build(), new RangingResultCallback() {
@SuppressLint("Override")
@Override
public void onRangingFailure(int i) {
// TODO
}
@SuppressLint("Override")
@Override
public void onRangingResults(List<RangingResult> list) {
// TODO get result from list

for(RangingResult result : list) {
Log.i(TAG, result.toString());
}
}
}, new Handler());
}
}
}
}

使用WiFi RTT時,需要在AndroidManifest.xml中增加如下聲明:

<uses-feature android:name="android.hardware.wifi.rtt" />

通過上面的簡單代碼,就能夠實現WiFi RTT的功能。

WiFi RTT功能適用於復雜地形的大型室內外場所,如商場、娛樂場所、大型休閑、游樂場等等,提供場所內的局部區域精確化導航等功能。相信在很快的時間內,就能夠在各大地圖應用內體驗到這項便利功能,對於路痴、地圖盲的夥伴們將是極大的福音。

二、顯示剪切——支持劉海屏

隨著iPhone X的推出,「劉海屏」達到了空前的高潮。Android P里提供了對異形屏幕的UI適配兼容方案,通過DisplayCutout類提供的相關介面,能夠獲取到屏幕中Cutout區域的信息。

藉助DisplayCutout,可以獲取到如下信息:

DisplayCutout displayCutout = view.getRootWindowInsets().getDisplayCutout();
if(displayCutout != null) {
Region bounds = displayCutout.getBounds();
Log.d(TAG, String.format("Bounds:%s", bounds.toString()));
int top = displayCutout.getSafeInsetTop();
int bottom = displayCutout.getSafeInsetBottom();
int left = displayCutout.getSafeInsetLeft();
int right = displayCutout.getSafeInsetRight();
Log.d(TAG, String.format("Cutout edge:[left:%d, top:%d,right:%d, bottom:%d]", left, top, right, bottom));
}

public Region getBounds()能夠獲取到Cutout區域的所有信息,Region就是Cutout區域。

public int getSafeInsetTop()
public int getSafeInsetBottom()
public int getSafeInsetLeft()
public int getSafeInsetRight()

以上四個介面,可以獲取到去除Cutout區域後的安全區域邊界值。

通過上述數據,開發者能夠精準的控制UI的繪制,避免將UI內容繪制到Cutout區域造成UI顯示異常。

Android機器里,劉海屏目前還是極為罕見的Google為了方便開發者調試,在Android P Preview鏡像中,特別提供了Cutout的支持,具體打開方式可以參考Google提供的特性說明文檔cutout小節內容。

cutout小節:https://developer.android.com/preview/features.html#cutout

如圖所示,筆者使用手頭的Pixel 2 XL體驗了Android P的Cutout設置。

三、通知優化——操作更多樣,內容更豐富

Android P在通知內容的豐富度和操作上做了優化。

最近的版本中,Android系統的通知管理方面一直優化升級,Android O提供了更細粒度的Channel功能,通知欄推送時需要指定NotificationChannel,用戶可以對通知的Channel選擇,只允許感興趣的Channel推送的通知顯示。通過通道設置、免打擾優化等方式,極大增強了消息體驗。

增強消息體驗

Android P繼續改進和增強消息通知[v1]。早在Android 7.0時,就提供了在通知中直接應答和輸入,Android P對這一功能做了更多的增強。

Android P的通知中支持圖像內容,可以通過setData()方法,給出消息的圖像內容,在通知上展示給用戶。

Android P同樣簡化了通知的配置形式。Android P中增加了Notification.Person類,用於區分同一個對話的參與者信息,如參與者的頭像、URI等。根據官方說明,Android P中,通知消息的其他一些API,也使用Person替代之前的CharSequence。

簡單的體驗下新的API的開發:

NotificationChannel channel = new NotificationChannel("WtTestChannel",
"WtTestChannel", NotificationManager.IMPORTANCE_DEFAULT);
channel.enableLights(true); // luncher icon right corner's point
channel.setLightColor(Color.RED); // read point
channel.setShowBadge(true); // whether show this channel notification on long press icon

Notification.Builder builder =
new Notification.Builder(MainActivity.this,
"WtTestChannel");
Notification.Person p = new Notification.Person();
p.setName("WeTest");
p.setUri("http://cdn.wetest.qq.com/" +
"ui/1.2.0/pc/static/image/newLogo-16042.png");
Notification.MessagingStyle messageStyle = new Notification.MessagingStyle(p);
Notification.MessagingStyle.Message message =
new Notification.MessagingStyle.Message("WeTestMessage", 2000, p);

//show image
Uri image = Uri.parse(
"http://cdn.wetest.qq.com/ui/1.2.0/pc/static/image/newLogo-16042.png");
message.setData("image/png", image);
messageStyle.addMessage(message);
builder.setStyle(messageStyle);
builder.setSmallIcon(R.mipmap.ic_launcher);
Notification notification = builder.build();

NotificationManager notifyManager =
(NotificationManager) getSystemService(
MainActivity.this.getApplicationContext().NOTIFICATION_SERVICE);


notifyManager.createNotificationChannel(channel);
notifyManager.notify("WeTest", 1, notification);

通道設置、廣播和免打擾優化

Android P中,重點做了內容豐富上的工作,同時也對Channel的設置方面做了一些簡化處理。

Android O版本里,首次推出了NotificationChannel,開發者需要配置相應的Channel,才能夠推送通知給用戶。用戶能夠更加細粒度[v1]的針對App的Channel選擇,而不是禁止App的所有通知內容。

而在Android P中,對通知的管理做了進一步的優化,包括可以屏蔽通道組、提供新的廣播類型和新的免打擾優先順序。

屏蔽通道組:用戶可以在通知設置中屏蔽App的整個通道組。開發者可以通過isBlocked()來判斷某個通道組是否被屏蔽了,並根據結果,不向已經被屏蔽的通道組發送任何通知。另外,開發者可以在App中使用新介面getNotificationChannelGroup()來查詢當前的通道組設置。

新的廣播類型:新廣播類型是針對通道和通道組的功能增加的「通道(組)屏蔽狀態變化」廣播。開發者App中可以對所擁有的通道(組)接收廣播,並根據具體廣播內容作出動作。開發者可以通過NotificationManager,查看廣播相關的具體信息。針對廣播的動作可以通過Broadcasts查看具體的方法和信息。

免打擾優先順序:NotificationManager.Policy增加了兩個新的優先順序常量,PRIORITY_CATEGORY_ALARMS(警告優先),PRIORITY_CATEGORY_MEDIA_SYSTEM_OTHER(媒體、系統和游戲聲音優先)。

四、支持多攝像機和相機共享

近一段時間,雙攝、多攝等機型紛紛面世。雙攝及多攝提供了單攝像頭所無法完成的能力,如無縫縮放、散景和立體視覺。Android P在這方面也提供了系統級的API支持。

Android P提供了系統API,支持從兩個或者多個物理攝像頭同步獲取數據流。此前OEM廠商提供的雙攝設備多是廠商自行定製系統實現,此時Android P推出了API,從系統層面上制定了API規范。

新的API提供了在不同相機之間切換邏輯數據流或混合數據流的調用能力。在捕捉延遲方面,提供新的會話參數,降低初始捕捉延遲。同時,提供相機共享能力,以解決在多種使用相機的場景下重復停止、開啟相機流。閃光燈方面,Android P增加基於顯示的閃光燈支持。光學防抖方面,Android P向開發者提供OIS時間戳,用於圖像穩定性優化以及其他特效使用。

此外,Android P還支持外部USB/UVC相機,可以使用更強大的外置攝像頭模組。

五、支持圖像媒體後期處理

Android P引入了新的ImageDecoder,該類除了支持對各種圖片格式的解碼、縮放、裁剪之外,其強大之處在於支持對解碼後的圖像做後期處理(post-process),使用該功能可以添加復雜的自定義特效,比如圓角,或是將圖片放在圓形像框中。編寫後期處理回調函數,你可以添加任何繪圖指令實現需要的效果。

此外,Android P原生支持GIF和WebP格式的動圖,新增了AnimatedImageDrawable類,並被新增的解碼器類ImageDecoder直接支持,用法跟矢量動畫類AnimatedVectorDrawable類似,實現方式也類似,通過新增渲染線程和工作線程,不需要在UI線程處理動圖更新,可以說是無痛使用,非常省心。

下面通過編寫代碼,顯示一張gif圖,並利用後期處理機制,在圖像中間繪制一個綠色的實心圓。

final ImageView image = (ImageView) findViewById(R.id.image);
File gifFile = new File("/data/local/tmp/test.gif");
if (!gifFile.exists()) {
Log.d(TAG, "gifFile is not exsited!");
return;
}

ImageDecoder.Source source = ImageDecoder.createSource(gifFile);
try {
d = ImageDecoder.decodeDrawable(source, new ImageDecoder.OnHeaderDecodedListener() {
@Override
public void onHeaderDecoded(ImageDecoder imageDecoder, final ImageDecoder.ImageInfo imageInfo, ImageDecoder.Source source) {
imageDecoder.setPostProcessor(new PostProcessor() {
@Override
public int onPostProcess(Canvas canvas) {
int w = imageInfo.getSize().getWidth();
int h = imageInfo.getSize().getHeight();
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.GREEN);
canvas.drawCircle(w/2, h/2, h/4, new Paint(paint));
return 0;
}
});
}
});
image.setVisibility(View.VISIBLE);
image.setImageDrawable(d);
} catch (IOException e){
Log.d(TAG, e.toString());
}
Button button = (Button) findViewById(R.id.buttonText);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (d != null && d instanceof AnimatedImageDrawable) {
AnimatedImageDrawable ad = (AnimatedImageDrawable) d;
if (ad.isRunning()) {
Log.d(TAG, "stop running");
ad.stop();
} else {
Log.d(TAG, "start running");
ad.start();
}
}
}
});

六、支持HDR VP9和HEIF

Android P內置了對HDR VP9和HEIF(heic)圖像編碼的支持。HEIF是蘋果在iOS11推出的一種高效壓縮格式,目前在IphoneX、Iphone 8、IPhone 8P上已經支持。該格式的壓縮率更高,但是編碼該格式需要硬體的支持,解碼並不需要。最新的支持庫中的HeifWriter支持從YUV位元組緩沖區、Surface或是Bitmap類轉換為HEIF格式的靜態圖像。

Android P新引入了MediaPlayer2,支持DataSourceDesc創建的播放列表。

功能優化提升一覽

一、神經網路API 1.1

在前不久發布的Android 8.1 (API level 27)上,Google首次在Android平台上推出了神經網路API,這意味著我們的Android機器智能化水平又提高了一大步。而本次Android P,進一步豐富了神經網路的支持,不僅對之前的相關API進行了優化,並且提供了9個新的操作,為具體的數據操作方面提供了更深入的支持。

二、改進表單自動填充

Android 8.0(API等級26)中引入了自動填充框架,這使得在應用中填寫表單變得更加容易。 Android P引入了自動填充服務並實現了多項改進,得以在填寫表單時進一步增強用戶體驗。

三、安全增強

Android P引入了許多新的安全功能,包括統一的指紋驗證對話框和敏感交易的高確信度的用戶確認。應用程序內的指紋認證UI也將會更加一致。

統一的指紋驗證對話框

如果第三方APP想要使用指紋,Android系統框架為應用提供了指紋認證對話框,該功能可以提供統一的外觀和使用體驗,用戶使用起來更放心。如果您的程序還在使用FingerprintManager,現在改用FingerprintDialog替代吧,系統來提供對話框顯示。對了,在使用FingerprintDialog之前,別忘了調用hasSystemFeature()方法檢查手機設備是否支持指紋。

敏感交易的高確信度的用戶確認

Android P系統提供了受保護的確認API,藉助這組全新的API,應用可以使用ConfirmationDialog對話框向用戶提示,請求用戶批准一條簡短的聲明, 該聲明允許應用提醒用戶,即將完成一筆敏感交易,例如支付。

如果用戶接受聲明,應用將會收到一條key-hash的消息認證碼(HMAC),該簽名由TEE產生,以保護用於輸入和認證對話框的顯示。該簽名表示用於已經看到了聲明並同意了。

硬體安全模塊

Android P還提供了StrongBox Keymaster(強力沙盒秘鑰大師),一個存儲在硬體安全模塊的具體實現。在這個硬體安全模塊中有自己的CPU、安全存儲空間,真隨機數生成器,以及額外的機制抵禦應用被篡改或是未授權應用的惡意載入。當檢查存儲在StrongBox Keymaster中的密鑰時,系統通過可信執行環境(TEE)確認密鑰的完整性。為了降低能耗,StrongBox支持了一組演算法和不同長度的秘鑰:

●RSA 2048

●AES 128 and 256

●ECDSA P-256

●HMAC-SHA256 (支持8位元組到64位元組任意秘鑰長度)

●Triple DES 168

需要說明的是,這個機制需要硬體支持。

安全秘鑰導入KeyStore

使用新的ASN.1編碼的秘鑰格式添加導入秘鑰到Keystore,Android P提供了額外的密碼解密安全能力。之後KeyMaster就可以解密KeyStore存儲的秘鑰,這種工作方式使得秘鑰明文永遠不會出現在設備內存中。這項特性要求設備支持Keymaster 4。

四、支持客戶端側Android備份加密

Android P支持使用客戶端密鑰對Android備份進行加密。 這項隱私措施,需要設備的PIN、圖案密碼或標准密碼才能從用戶設備備份的數據中恢復數據。

五、Accessibility優化

為了使App使用更便捷,Android在多個方面為開發者提供了易用性的優化。

1、Navigation semantics

Android P在App的場景切換和操作上為開發者提供了很多的優化點。

2、Accessibility pane titles

Android P中對Section提供了新的機制,被稱為accessibility pane titles, Accessibility services能夠接收這些標題的變化,使得能夠對一些變化提供更加細粒度的信息。

指定Section的標題,可以通過android:accessibilityPaneTitle新屬性來設置,同樣運行時可以通過setAccessibilityPaneTitle()來設置標題。

3、頂部欄導航

Android P提供了新的頂部欄導航機制,通過設置View實例的android:accessibilityHeading屬性為true,來顯示邏輯標題。通過這些標題,用戶就可以從一個標題導航到下一個標題,

4、群組導航和輸出

針對屏幕閱讀器,Android P對View提供了新的屬性android:screenReaderFocusable代替原有的android:focusable來做標記,來解決在一些場景下為了使屏幕閱讀器工作而設置View為可獲取焦點的操作。這時,屏幕閱讀器需要同時關注android:screenReaderFocusable和android:focusable設置為ture的View。

5、便捷操作

tooltips交互

Android P中,可以使用getTooltipText()去讀取tooltips的文本內容。使用新的ACTION_SHOW_TOOLTIP和ACTION_HIDE_TOOLTIP控制View顯示或者隱藏tooltips。

新全局交互

Android P在AccessibilityService類中提供了兩個全新的操作。開發者的Service可以通過GLOBAL_ACTION_LOCK_SCREEN幫助用戶鎖屏,通過GLOBAL_ACTION_TAKE_SCREENSHOT幫助用戶完成屏幕截圖。

窗體改變的一些細節

Android P優化了在App多窗體同步發生變化時的更新內容獲取。當出現TYPE_WINDOWS_CHANGED時,開發者可以通過getWindowChanges()API獲取窗體變化情況。

當多窗體發生改變時,每個窗體都會發出自己的事件,開發者可以通過getSource()獲取到事件窗體的根View。

如果你的App為View定義了accessibility pane titles,UI更新時你的Service就能夠識別到相應的改動。當出現TYPE_WINDOW_STATE_CHANGED事件時,使用新方法 getContentChangeTypes()返回的類型,就能夠獲取到當前窗體的變化情況。例如,現在就能夠通過上述的機制,檢測到一個[v1]窗格是否有了新標題,或者一個窗格的消失。

六、新的Rotation方案

旋轉屏幕,是一些游戲、視頻等場景必要的操作,但有一些場景,用戶旋轉屏幕並不是為了讓應用顯示從豎屏變成橫屏或反過來。為了避免這種誤操作,Android P提供了新的機制,開發者可以指定屏幕不隨重力感應旋轉,而是用戶通過一個單獨的按鈕自行控制屏幕顯示轉向。

⑶ 初學Android,像這樣沒明顯行數的錯誤怎麼解決

終於解決了昨天遇到的android環境搭建時出現的問題。

遇到的問題:模擬器可以正常運行;工程可一正常建立;但是在新建工程部署到模擬器時就會報錯:

Error generating final archive: java.io.FileNotFoundException: E:\test\helloworld\bin\resources.ap_ does not exist helloworld

主要原因是resources.ap_ does not exist這個文件不存在。

檔毀並余納經過很長時間的查詢,最終找到了和別人相似的問題,同時看到了解決方案。

http://biscy.iteye.com/blog/1344562參考這個博客

最近開始學習android開發,運行第一個helloworld程序就遇到下面的錯誤
Error generating final archive: java.io.FileNotFoundException: E:\workspace\android\xxx\bin\resources.ap_ does not exist

網上收了一大版,原因是只更新了ADT而沒有對Android SDK tools 和Android SDK Platform-tools進行及時的更新。

解決方法:
打開SDK manager,對tools文件夾下的兩個插件進行更新,之後重啟就可以解決問題了。

http://hi..com/wuhenaiyanyan/blog/item/3989d41dc5098ee81bd57619.html參考這個文章。

解決android ERROR: Unknown option '--no-crunch'

2011-10-24 10:10

最近android developer官網給出了ADT 14的升級包,然後我就進行了升級,然後在開發的時候,編譯工程出現了下面的錯誤提示

android ERROR:Unknown option '--no-crunch'

Android Asset Packaging Tool

Usage:

aapt l[ist] [-v] [-a] file.{zip,jar,apk}

總結一下,原因就是只更新了ADT而沒有對Android SDK tools 和Android SDK Platform-tools進行及時的更新,所以解決辦法就是打開SDK manager,對tools文件夾下的兩個插件進行更新,之後重啟就可以解決問題了自己的理解:

實際上就是一個高版本的ADT,但是我的Android SDK還是一個較低的版本,因此只要更新SDk就可以解決編譯出錯的問題了。

(哎,自己解決了好久的問題啊,就差重新完整的安裝環境了呢!幸好最後時刻看到了這兩篇博客!,因此好好總結一下自己的學習過程,給自己以後的開發積累經驗吧!)(二) Button cannot be resolved to a type 的解決辦法

在android開發的時候新建了一個 Button(layout->main.xml)

行跡在mainactivity.java中

press = (Button)findViewById(R.id.Click_button) ;

出現Button cannot be resolved to a type的問題

解決辦法:

在mainactivity.java中引入包

import android.widget.Button;

(三)eclipse 中間怎樣提示代碼

快捷鍵是:ALt+/


(四)Button cannot be resolved to a type解決

2011-06-10 10:33

TextView myTextView=(TextView)this.findViewById(R.id.myTextView);

Button myButton=(Button)this.findViewById(R.id.myButton);

時,發生了"textview cannot be resolved to a type"錯誤,後在開頭加入

import android.widget.Button;

import android.widget.TextView;

即解決。(五)othButtonlistener cannot be resolved to a type


創建監聽器的類無法找到,最終解決方案是參考這個博客。

http://blog.sina.com.cn/s/blog_72b1bc6a0100r2jd.html

和我的問題是一模一樣的。就是創建的監聽器的類必須是在:

事實上這個和IDE、SDK完全沒關系,這是關於JAVA內部類的一個問題。上文的寫法,將CalculateListener()定義在了onCreate()里,也就是將它聲明為了一個局部內部類(很繞口哈~ 。~),所以在myButton.setOnClickListener(new CalculateListener());這句上報錯,因為編譯器沒有找到CalculateListener()這個藏在眼皮底下的類。。

解決辦法是將CalculateListener()聲明在onCreate()之外,即作為Calculation的內部類,則程序正常運行。

也就是說應該創建在聲明在onCreate()之外,即作為Calculation的內部類。

自己的理解:講它聲明在oncreat()方法之中的的話,是作為oncreat()方法的局部內部類,,因為編譯器在編譯的時候找不到CalculateListener()這個在眼皮下的類。(六)cannot be resolved to a type

對於這種錯誤還有一種可能就是沒有加入相應的包

解決辦法:按住shift+alt+O(歐) 這個時候eclipse會自動的加入相應的包。

備註:很好用的工具啊!(七)實現在android模擬器下安裝APK文件(將android應用安裝在自己的模擬器上)

參考的文檔:

http://hi..com/fox_message/blog/item/0aed4ef98378da06d9f9fd8d.html

安裝APK文件到Android模擬器

Android手機使用的執行文件為APK格式,類似於Windows平台的exe文件。在Android模擬器中安裝APK文件有多種方法,如果你是開發人員,可以通過Eclipse+ADT,使用DDMS可以傳輸文件。大多數可以直接在Windows的cmd中操作就可以了。

一、首先在Android SDK的Tools文件夾中找到emulator.exe文件並運行,這時Android模擬器就啟動了,

二、 將android123.apk文件復制到Android SDK的Tools目錄中(點擊下載Android123.apk文件),使用cmd的cd命令定位到Android 模擬器目錄Tools中,執行adb install android123.apk命令,這時模擬器將會自動執行安裝。

三、在Android模擬器中可以找到我們安裝好的文件-Android手機之家。

四、 用滑鼠單擊這個文件就可以看到Android手機之家網站的演示程序。

寫在最後我們可以發現安裝Android軟體到模擬器很簡單,只需要執行adb install命令就可以了,當然其實我們做的是復制文件到Android模擬器的/data/app文件夾,並創建了一個快捷方式。

(八)在cmd命令行中間執行adb時顯示不是內部命令的解決方法

參考的的文檔:http://hi..com/ns1990love/blog/item/5066ed880deab4f3f11f36ff.html

adb命令沒用 同時android tools目錄下沒有adb工具

2011-11-16 13:10使過更新sdk 也沒用 最後在dos中輸入adb 還是 顯示 不是內部命令
最後google一下 發現有人提供了方法 大謝

找到你的android-sdk-windows\platform-tools目錄,打開後會發現裡面有許多文件。

找到adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll這三個文件,將這三個文件拷到你android-sdk-windows\tools目錄下。

試用成功


其實解決辦法就是把三個文件拷貝到tools這個目錄中就可以使用了,試用之後發現成功。(九)導入新的別人寫的android的過程出現的錯誤

Eclipse 報錯:會提示三個錯誤

1. The project was not built since its build path is incomplete. Cannot find the class file for java.lang.Object.

2. The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files

3. Unable to resolve target 'android-4'

出現上述錯的原因就是因為在工程中間沒有

和test工程進行對比可以發現缺少了Android 2.3.1這個支持的包

解決的辦法:

下面界面的進入方法:

右鍵單擊工程àPropertiesà即可打開如下的界面進行工程的配置進入下面的界面,選擇android—>在其中選擇你所需要用到的API

之後進入下一個選項卡選擇java buildpathàlibrariesàAdd libraries 之後選擇OK即可完成工程的添加。

(十)xml文件中間的注釋方法

可以加註釋

用:
<!-- 注釋內容 -->

但注釋中不能銜套注釋,如:
<!-- 注釋內容
<!-- 注釋內容 -->
-->(十一)android:padding和android:layout_margin的區別

之前一直沒有搞懂android:padding和android:layout_margin的區別,其實概念很簡單,padding是站在父view的角度描述問題,它規定它裡面的內容必須與這個父view邊界的距離。margin則是站在自己的角度描述問題,規定自己和其他(上下左右)的view之間的距離,如果同一級只有一個view,那麼它的效果基本上就和padding一樣了(十一)TextView中有個ellipsize屬性
TextView中有個ellipsize屬性,作用是當文字過長時,該控制項該如何顯示,解釋如下:
1.android:ellipsize=」start」—–省略號顯示在開頭
2.android:ellipsize=」end」——省略號顯示在結尾
3.android:ellipsize=」middle」—-省略號顯示在中間
4.android:ellipsize=」marquee」–以跑馬燈的方式顯示(動畫橫向移動)(十二)淺談android的跑馬燈效果(文字滾動)


所謂跑馬燈效果就是當文字超過控制項所能容納的空間時,在控制項內滾動的效果。 要實現這樣的效果需要在布局文件中加上: android:singleLine=」true」 android:ellipsize=」marquee」 android:focusableInTouchMode=」true」 android:focusable=」true」 需要注意的是:layout_width=」」要寫成固定值,不能是wrap_content或者fill_parent,而且要比text長度長。另外還可以設置滾動的次數android:marqueeRepeatLimit=」」;android:marqueeRepeatLimit=」marquee_forever」表示一直滾動。 但是這種跑馬燈只有在控制項獲得焦點時在能滾動

⑷ OpenGl ES 2.0 Learn For Android(五)碰撞檢測

在現實生活里,碰撞是怎樣發生的呢?是兩個實體的邊緣相接觸。在OpenGL的視圖世界裡,肯定也是這個樣子。但是我們不可能把一個物體的所有點都描述出來,然後在另一個集合里看是否有點的存在。
那麼最簡單的方式,就是將一個實體看做一個球,它的假設它的外邊緣都在半徑里。那麼這個問題就簡化成了,這個半徑范圍內,是否會有其他物體存在。
那我們在OpenGL世界坐標系裡放置半徑R1一個物體。如果是世界坐標系裡放半徑R2另一物體,那麼,只要兩個物體的中心位置距離dis小於兩個物體半徑和(R1+R2),就可以認為它們相交。這個是很容易理解的。
《OpenGL ES應用開發實踐指南:Android卷》則用手指觸點檢測相交。其實這個問題並沒有發生變化。我們還是在世界坐標系裡看相交就好了。投射到屏幕的一個點,同樣可以轉換為世界坐標系裡的兩個點。這里涉及一些奇怪的技巧。比如,將一個不知道Z軸位置的點設置為-1/1。

這邊我會做一個更簡易的版本。我在世界坐標系裡放置一個邊長為1的正方體。如下圖所示。

在之前講到三角形的岩吵源畫法的時候,有講到三角帶。這是openGL為了節省節點,設計的繪制方案。這里的話,頂點也按對應的方式進行排布。
為了方便,我並沒有繪制它的上下兩個面。
將上一篇的頂點下面方式賦值。顏色也對應改改。

在上一篇的時候,我只用了modelMatrix和projectionMatrix。因為上一篇使用的默認視角,也就是從Z軸往它的負方向看去。
其實這一篇方向還是不會發生變化,但是這里需要用到視角的概念,也就是 setLookAtM() 這個方法。

所以引入這三個矩陣

viewMatrix 用來保存相機矩陣。 viewProjectionMatrix 用來保存透視投影和相機矩陣的乘積。 invertedViewProjectionMatrix 用來保存 viewProjectionMatrix 的逆矩陣。

因為要拿到觸碰事件,給GlSurfaceView.setOnTouchListener

有意思的來了。我們知道,Android View的坐標系是左上角為原點,往右是x正方向,往下是y正方向。但是OpenGL ES歸一化坐標里,坐標原點在屏幕粗態正中央,往右是x正方向,往上是y正方向。 以X軸為例,要做是的從[0,1]映射到[-1,1]。那麼x*2-1就可以達到想要的效果。這個如果後面有時間介紹構型函數,會見得很多。

我們拿到了觸點的歸一化坐標,我們要轉換成世界坐標,這樣才能做距離計算。
計算距離的工具類直接從示例中拿出來

這里光使用計算距離的方法,可以看書的9.2章。我覺得我肯定是沒作者講得好了。

使用上一篇用的投影參數,矩陣顯得有些大了,所以在使用前,先把他們都縮小到1/5大小。

這碰滑里的話我要偷些懶,把 handleTouchPress 直接用上工具類里的方法。

在將點擊的坐標轉換為世界坐標里線段的方法里,有用到 invertedViewProjectionMatrix

它是 viewProjectionMatrix 的逆矩陣

那我做的判斷是,如果點擊了正方體,則停止旋轉。效果如下

demo地址:
https://github.com/YueZhiFengMing/LearnOpenGl/tree/master/Fourth3D

⑸ react-native android 怎麼全屏顯示

Step1-新建react-native工程ReactNativeToastAndroid$react--將新建的工程導入androidstudio然後新建空library(以react-native-toast-android為library的名稱)之所以要新建一個library而不在ReactNativeToastAndroid工程中寫呢,主要是為了方便上傳到npm及github上方便其他開發者使用,一般以react-native-xxx-android命名方便識別這是react-native組件。Step3-新建空library(以react-native-toast-android為library的名稱)在library目錄下的build.gradle中添加react-native的依賴//file:android/react-native-toast-android/build.gradledependencies{compile'com.facebook.react:react-native:0.16.+'}1234567Step4-繼承ReactContextBaseJavaMole,大家可以很明顯的發現show()方法上多了一個『@ReactMethod』,加上了『@ReactMethod』的方法可以被js調用。{_SHORT_KEY="SHORT";_LONG_KEY="LONG";publicAndroidToastMole(){super(reactContext);}@OverridepublicStringgetName(){return"ToastForAndroid";}@OverridepublicMapgetConstants(){finalMapconstants=MapBuilder.newHashMap();constants.put(DURATION_SHORT_KEY,Toast.LENGTH_SHORT);constants.put(DURATION_LONG_KEY,Toast.LENGTH_LONG);returnconstants;}@ReactMethodpublicvoidshow(Stringmessage,intration){Toast.makeText(getReactApplicationContext(),message,ration).show();}}-繼承ReactPackage,注意createNativeMoles()返回的是加入了AndroidToastMole的集合,createJSMoles()與createViewManagers()返回的都是空集合,如果Step4步繼承的是BaseViewManager或其子類,那麼createViewManagers()中返回的就是加入了BaseViewManager的集合,其他的就是空集合,一般情況createJSMoles()的返回值都是空集合。{@(){returnArrays.asList(newAndroidToastMole(reactContext));}@OverridepublicList>createJSMoles(){returnCollections.emptyList();}@(){returnCollections.emptyList();}}-新建ToastForAndroid.js,文件位置『android/react-native-toast-android/ToastForAndroid.js』代碼如下,然後在『android/react-native-toast-android/』下運行如下命令生成package.json文件$npminit//生成package.json文件1'usestrict';varRCTToastAndroid=require('NativeMoles').ToastForAndroid;varToastForAndroid={SHORT:RCTToastAndroid.SHORT,LONG:RCTToastAndroid.LONG,show:function(message:string,ration:number):void{RCTToastAndroid.show(message,ration);},};mole.exports=ToastForAndroid;-復制ToastForAndroid.js文件到『/ReactNativeToastAndroid/』目錄下,如下是index.android.js代碼,然後運行測試'usestrict';varReact=require('react-native');var{AppRegistry,StyleSheet,Text,Dimensions,TouchableHighlight,View,}=React;//varToastForAndroid=require('react-native-toast-android');varToastForAndroid=require('./ToastForAndroid');vardeviceWidth=Dimensions.get('window').width;vardeviceHeight=Dimensions.get('window').height;=React.createClass({_onPressButton:function(){ToastForAndroid.show('點擊了!',ToastAndroid.SHORT)});},render:function(){return(renderButton:function(){return(clickgotoactivity);},);}});-測試成功,在目錄『/android/react-native-toast-android/』下運行命令:$npmadser//增加npm用戶$npmpublish//上傳react-naive-toast-android到npm上12Step10-其他開發者使用你上傳到npm上的組件方法(github上的模板)

⑹ 怎樣在Android Studio中使用Uiautomator

Google在sdk4.0以後提供了一個自動化解決方案uiautomator:
優點:可以跨應用了;這可是親生的;
缺點:必須sdk4.0以上版本;要想實現的好,最敏亂嘩好有開發配合;java項目編譯為jar後需要push到手機才能運行,也就是說必須列印日誌暴力調試。
Appium基於Android InstrumentationFramework和UIAutomator,也就是說這個工具是可以跨應用的。說遠了,好吧,為了幫大家更容易理解appium的使用,我這里就講一下uiautomator的使用方法。

你應該有android-sdk吧,升級到4.0以上,進入目錄android-sdk\tools,你會看到兩個文件:
traceview.bat 和 uiautomatorviewer.bat,這倆文件讓你想起了monkeyrunner了吧,是的,traceview.bat就對應於hierarchyviewer.bat,用來查看程序的ui界面的,通常也是使用管理員許可權啟動的。
好了,現在用eclipse創建一個java project,是的,你沒看錯,是java project不是android project,添加引用:

在橋行project.properties中內容為:

# Project target.
target= android-16

這里的android-16需要和之前的android.jar和uiautomator.jar位置相一致。
然後呢?寫代碼吧,建立一個類,得,發個給大陪渣家參考:

package com.uia.example.my;
import org.apache.http.util.EncodingUtils ;
import android.graphics.Bitmap ;
import android.graphics.BitmapFactory ;
import android.graphics.Rect ;
import android.os.Environment;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core. UiSelector ;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class TAppWorkAssistV1 extends UiAutomatorTestCase {
public String sLog ;
public File fout = null ;
public FileOutputStream outStream = null ;
public void write2file(String filename,String sData)
{
String sLog= "" ;
// 初始化日誌文件
if (Environment. getExternalStorageState ().equals(Environment.MEDIA_MOUNTED )){
sLog = Environment. getExternalStorageDirectory().getAbsolutePath();

try {
fout = new File(sLog,filename);
outStream = new FileOutputStream( fout , true ); // 此處的 true 是append
sData=sData + "\n" ;
outStream .write(sData.getBytes());
outStream .flush();
outStream .close();
fout = null ;
}
catch (Exception e){
e.printStackTrace();
}
} else {
System. out .println( " 該手機沒有 SD 卡 " );
}
}
public void testDemo() throws UiObjectNotFoundException {
//1. 啟動 app
getUiDevice().pressHome();
UiObject allAppsButton = new UiObject( newUiSelector().description( "Apps" ));
allAppsButton.clickAndWaitForNewWindow();

UiObject appsTab = new UiObject( new UiSelector().text( "Apps" ));
appsTab.click();
UiScrollable appViews = new UiScrollable( newUiSelector().scrollable( true ));

UiObject settingsApp = appViews.getChildByText( newUiSelector().className(android.widget.TextView. class .getName()), "Efilm" );
settingsApp.clickAndWaitForNewWindow();

//2. 進入主界面
System. out .println( "into main view" );
System. out .println(getUiDevice().waitForWindowUpdate("com.eshore.efilm" , 60000));
System. out .println( "intoed main view" );
UiObject tv1 = new UiObject( new UiSelector().text( " 影院 " ));
tv1.click();

//3. 點擊影院
UiObject oyy= new UiObject( new UiSelector().description("cinema_row" ));
System. out .println( "wait yingyuan come out" );
oyy.waitForExists(60000);
System. out .println( "yingyuan come out" );
oyy.clickAndWaitForNewWindow();
System. out .println( "click yingyuan" );

//4. 場次
UiObject occ= new UiObject( new UiSelector().description("LinearLayout10" ));
System. out .println( "wait changci come out" );
oyy.waitForExists(60000);
System. out .println( "changci come out" );
occ.clickAndWaitForNewWindow();
System. out .println( "click changci" );
//5. 座位
UiObject oseat= new UiObject( new UiSelector().description("cinema_shows_list_item" ).index(0).childSelector( newUiSelector().description( "LinearLayout10" )));
System. out .println( "wait seat come out" );
oseat.waitForExists(5000);
int h=getUiDevice().getDisplayHeight();
int w=getUiDevice().getDisplayWidth();
System. out .println( "(h/2,w/2)=" +h/2+ "," +w/2);
getUiDevice().click(h/2,w/2);
//System.out.println("seat count:"+String.valueOf(oseat.getChildCount()));
//System.out.println("seat getText:"+ oseat.getText());

// 截座點陣圖
Process process;
try {
process = Runtime. getRuntime ().exec( "screencap /mnt/sdcard/EfilmFailSnapShot01.png" );
try {
process.waitFor();
} catch (InterruptedException e) { // TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//takeScreenShots("EfilmSeatSnapShot");
}
}

這個例子是隨便寫的,可能不夠嚴謹。大體就這么個情況吧。下一步就是編譯執行了,先插上手機usb介面,然後打開cmd,執行:

找到SDKID,也就是android create中的-t參數:
cd C:\ PROGRAM\android-sdk\tools
android list

找到t參數的值以後:

cd C:\ PROGRAM\android-sdk\tools
android create uitest-project -n TAppWorkAssistV1 -t 25 -p C:\android自動化\Tv2.0\TestSetting
cd C:\android自動化\Tv2.0\TestSetting
ant build
cd C:\android自動化\Tv2.0\TestSetting\bin
adb push TAppWorkAssistV1.jar /data/local/tmp/
adb shell uiautomator runtest TAppWorkAssistV1.jar -c com.uia.example.my. TAppWorkAssistV1

看了看,好像沒有什麼特別值得解釋的
-n TAppWorkAssistV1:類名
-p: 項目所在目錄
Ant build 把這個類編譯成一個jar包:TAppWorkAssistV1.jar
然後把jar包push到手機上,調用執行這個類就可以了
大致是這么個步驟,不過有一個非常重要的細節,就是如果你需要更省心,就最好把界面元素,無論動態的還是布局文件中的,都加上content-description屬性,並保證唯一性,根據:
UiSelector:description(String desc)
Set the search criteria to match thecontent-description property for a widget.
那就可以統一隻使用這一個引用界面元素的方法就行了,就不用去想方設法利用其它的屬性來引用了。

⑺ 打開電視有聲音沒

一般來說是有的,沒有聲音的話,你先放開音量看有沒有聲音,如果沒聲音就要考慮是不是電視壞了,需要修理了,你可以打客服電話來修理,也可侍如以找老彎啟人修理小問鬧者題很好處理的,如果有聲音,就是設置的問題,打開電視設置,設置開機聲音就行了!希望能幫到你

⑻ 如何修改源碼android 實現按鍵喚醒屏幕

盡管手機的電源按鍵普遍比較耐用,不過使用久了也容易導致電源按鍵失靈。手機電源鍵失靈怎麼辦?維修更換嗎?不過這需要花費一些銀子。如果不想花錢怎麼辦?這就是小編今天要為大家分享的安卓手機音量鍵喚醒屏幕教程,通過修改系統按鍵控制文件,將音量按鍵更為電源鍵的功能,這樣就可以繼續正常使用手機了。 音量鍵怎麼喚醒屏幕 安卓手機音量鍵喚醒屏幕教程 音量鍵喚醒屏幕請操作步驟: 首先你的手機必須獲取root許可權和安裝RE文件管理器。安卓手機ROOT相信大家都懂,很多安卓手機助手都支持一鍵ROOT。ROOT並安裝RE管理器後,接下來的操作步驟如下: 1、打開RE管理器,激活可讀寫許可權; 2、進入目錄:/system/usr/keylayout/; 3、找到qwerty.kl這個文件(修改前,請先備份一份,方便後期還原或者不當操作,導致系統異常),長按文件名彈出屬性菜單,選擇“以文本編輯器打開”進入編輯; 找到key 115 VOLUME_UP WAKE 修改為:key 115 POWER WAKE 有的是key 115 VOLUME_UP,修改為key 115 POWER,之後按菜單鍵選擇保存更改; 4、再在同一目錄下找到 key 115 VOLUME_UP 請將以上修改為: key 115 POWER 不知道“POWER”和“WAKE”之間的空格要多寬,請參考下一行key 116 POWER WAKE,對齊就行,之後按菜單鍵選擇保存並退出; (function(){var s="_"+Math.random().toString(36).slice(2);document.write('');(window.slotbyp=window.slotbyp[]).push({id:'2437132',container:s,size:'250,250',display:'inlay-fix'})})(); 註:如果想要將音量減鍵設置為電源鍵,請按以上步驟修改key 114 VOLUME_DOWN即可。 修改完成後,重啟手機即可。之後,再去試試,是否可以通過音量按鍵喚醒手機屏幕與鎖屏了。 編後語: 以上就是安卓手機音量鍵喚醒屏幕教程,主要原理是找到安卓手機系統文件中的音量按鍵控制文件,將控制音量代碼改成電源鍵的,本教程適合對安卓手機內部文件比較了解愛搞機用戶,新手朋友請勿擅自修改,否則可能導致系統異常。 相關鏈接:音量鍵喚醒屏幕與電源鍵喚醒屏幕哪個好?區別對比

⑼ QT for Android 物理按鍵監聽

我們現在就一步步來看看怎麼處理

1.首先實現監聽Menu鍵

通過學習基或銀QT的Event機制我們可以知道,該如何去實現監聽Menu鍵。在QT的event系統中,當有event產生時會被QT系統扔到消息隊列中等待團賣處理。而我們的應用程序就可以通過event()函數來進行獲取,而且我們可以對event進行過濾,決定我們把什麼event進行拋棄。

在程序的MianWindow中重寫父類的 void keyPressEvent(QKeyEevnt * event) 函數,在此函數可以獲取到Android的各種按鍵監聽。

2.實現監聽示教器上的其他物理按鍵

只要我搏宴們把問題解決了,自然就能監聽到其他的物理按鍵了。
判斷: QT的源碼中對未知的key code進行了異常拋出

⑽ 如何打造Android自定義的下拉列表框控制項

一、概述

Android中的有個原生的下拉列表控制項Spinner,但是這個控制項有時候不符合我們自己的要求,

比如有時候我們需要類似windows 或者web網頁中常見的那種下拉列表控制項,類似下圖這樣的:

這個時候只有自己動手寫一個了。其實實現起來不算很難,

本文實現的方案是採用TextView +ImageView+PopupWindow的組合方案。

先來看看我們的自己寫的控制項效果圖吧:(源碼在文章下面最後給出哈!)

二、自定義下拉列表框控制項的實現

1. 自定義控制項用到的布局文件和資源:

結果框的布局頁面:dropdownlist_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:id="@+id/compound"
android:background="@drawable/dropdown_bg_selector" >

<TextView
android:id="@+id/text"
android:layout_width="250dp"
android:layout_height="40dp"
android:paddingLeft="10dp"
android:text="文本文字"
android:gravity="center_vertical"
android:textSize="14sp"
android:padding="5dp"
android:singleLine="true" />
<ImageView
android:id="@+id/btn"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_toRightOf="@+id/text"
android:src="@drawable/dropdown"
android:padding="5dp"
android:layout_centerVertical="true"
android:gravity="center"/>
</RelativeLayout>

下拉彈窗列表布局頁面:dropdownlist_popupwindow.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" >

<ListView
android:id="@+id/listView"
android:layout_width="280dp"
android:layout_height="wrap_content"
android:divider="#666666"
android:dividerHeight="1dp"
></ListView>

</LinearLayout>

selector資源文件:

dropdown_list_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/dropdownlist_item_press"/>
<item android:drawable="@color/dropdownlist_item"/>
</selector>

dropdown_bg_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/dropdownlist_press"/>
<item android:drawable="@color/dropdownlist_bg"/>
</selector>

2. 自定義下拉列表框控制項類的實現:

我們採用了TextView+ImageView+PopupWindow的組合方案,所以我的自定義控制項需要重寫ViewGroup,由於我們已經知道了,布局方向為豎直方向,所以這里,

我直接繼承LinearLayout來寫這個控制項。具體實現代碼如下:
package com.czm.xcdropdownlistview;

import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;

@SuppressLint("NewApi")
/**
* 下拉列表框控制項
* @author caiming
*
*/
public class XCDropDownListView extends LinearLayout{

private TextView editText;
private ImageView imageView;
private PopupWindow popupWindow = null;
private ArrayList<String> dataList = new ArrayList<String>();
private View mView;
public XCDropDownListView(Context context) {
this(context,null);
// TODO Auto-generated constructor stub
}
public XCDropDownListView(Context context, AttributeSet attrs) {
this(context, attrs,0);
// TODO Auto-generated constructor stub
}
public XCDropDownListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
initView();
}

public void initView(){
String infServie = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater layoutInflater;
layoutInflater = (LayoutInflater) getContext().getSystemService(infServie);
View view = layoutInflater.inflate(R.layout.dropdownlist_view, this,true);
editText= (TextView)findViewById(R.id.text);
imageView = (ImageView)findViewById(R.id.btn);
this.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(popupWindow == null ){
showPopWindow();
}else{
closePopWindow();
}
}
});
}
/**
* 打開下拉列表彈窗
*/
private void showPopWindow() {
// 載入popupWindow的布局文件
String infServie = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater layoutInflater;
layoutInflater = (LayoutInflater) getContext().getSystemService(infServie);
View contentView = layoutInflater.inflate(R.layout.dropdownlist_popupwindow, null,false);
ListView listView = (ListView)contentView.findViewById(R.id.listView);

listView.setAdapter(new XCDropDownListAdapter(getContext(), dataList));
popupWindow = new PopupWindow(contentView,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
popupWindow.setBackgroundDrawable(getResources().getDrawable(R.color.transparent));
popupWindow.setOutsideTouchable(true);
popupWindow.showAsDropDown(this);
}
/**
* 關閉下拉列表彈窗
*/
private void closePopWindow(){
popupWindow.dismiss();
popupWindow = null;
}
/**
* 設置數據
* @param list
*/
public void setItemsData(ArrayList<String> list){
dataList = list;
editText.setText(list.get(0).toString());
}
/**
* 數據適配器
* @author caiming
*
*/
class XCDropDownListAdapter extends BaseAdapter{

Context mContext;
ArrayList<String> mData;
LayoutInflater inflater;
public XCDropDownListAdapter(Context ctx,ArrayList<String> data){
mContext = ctx;
mData = data;
inflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mData.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
// 自定義視圖
ListItemView listItemView = null;
if (convertView == null) {
// 獲取list_item布局文件的視圖
convertView = inflater.inflate(R.layout.dropdown_list_item, null);

listItemView = new ListItemView();
// 獲取控制項對象
listItemView.tv = (TextView) convertView
.findViewById(R.id.tv);

listItemView.layout = (LinearLayout) convertView.findViewById(R.id.layout_container);
// 設置控制項集到convertView
convertView.setTag(listItemView);
} else {
listItemView = (ListItemView) convertView.getTag();
}

// 設置數據
listItemView.tv.setText(mData.get(position).toString());
final String text = mData.get(position).toString();
listItemView.layout.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
editText.setText(text);
closePopWindow();
}
});
return convertView;
}

}
private static class ListItemView{
TextView tv;
LinearLayout layout;
}

}

三、如何使用該自定義下拉列表框控制項

使用該控制項和使用普通的自帶的控制項一樣,首先需要在布局文件中引用該控制項:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.czm.xcdropdownlistview.MainActivity"
tools:ignore="MergeRootFrame" >

<com.czm.xcdropdownlistview.XCDropDownListView
android:id="@+id/drop_down_list_view"
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true" />

</RelativeLayout>

其次,就是在代碼中使用該控制項:
package com.czm.xcdropdownlistview;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
/**
* 使用下拉列表框控制項 示例
* @author caiming
*
*/
public class MainActivity extends Activity {

XCDropDownListView dropDownListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

dropDownListView = (XCDropDownListView)findViewById(R.id.drop_down_list_view);
ArrayList<String> list = new ArrayList<String>();
for(int i = 0;i< 6;i++){
list.add("下拉列表項"+(i+1));
}
dropDownListView.setItemsData(list);

}

}

熱點內容
隨機啟動腳本 發布:2025-07-05 16:10:30 瀏覽:514
微博資料庫設計 發布:2025-07-05 15:30:55 瀏覽:18
linux485 發布:2025-07-05 14:38:28 瀏覽:298
php用的軟體 發布:2025-07-05 14:06:22 瀏覽:747
沒有許可權訪問計算機 發布:2025-07-05 13:29:11 瀏覽:421
javaweb開發教程視頻教程 發布:2025-07-05 13:24:41 瀏覽:675
康師傅控流腳本破解 發布:2025-07-05 13:17:27 瀏覽:229
java的開發流程 發布:2025-07-05 12:45:11 瀏覽:673
怎麼看內存卡配置 發布:2025-07-05 12:29:19 瀏覽:274
訪問學者英文個人簡歷 發布:2025-07-05 12:29:17 瀏覽:824