当前位置:首页 » 安卓系统 » 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 浏览:513
微博数据库设计 发布:2025-07-05 15:30:55 浏览:17
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 浏览:674
康师傅控流脚本破解 发布: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