首页 > 编程技术 > android

Android 解决RadioGroup显示在输入法窗口上面的问题

发布时间:2016-10-2 16:23

下面我们来看一篇Android 解决RadioGroup显示在输入法窗口上面的问题,希望这篇教程能够为各位带来帮助,具体的步骤细节如下文介绍

如果你在开发过程中经常使用 RadioGroup,那你是否遇到过下面这种情况

S60808-164645

每当你点击EditText弹出输入法时,RadioGroup总是向上移动到输入法的上面。

你可能会想到需要给RadioGroup添加下面这条属性:

android:layout_alignParentBottom="true"
但当你打开xml文件时,很尴尬的发现这个属性已经加上了,那要怎么解决这个小bug呢?

其实很简单,只需要在AndroidManifest.xml文件里给当前类的注册信息中添加一个属性:

android:windowSoftInputMode="adjustNothing"
写法如下:

<activity
    android:name=".activity.MainActivity"
    android:windowSoftInputMode="adjustNothing"/>
或者是在该Activity的onCreate()方法里添加:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
下面是效果图:

S60808-164708

你们可能要问,为什么加上这句代码就可以解决这个问题了,这就要说一下windowSoftInputMode这个属性了。

首先,我们从这个属性的名称中,可以很直观的看出它的作用,这个属性就是来设置窗口软键盘的交互模式的。

windowSoftInputMode一共有以下10个值可选:

1.adjustNothing:窗口不做调整

2.adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分(软键盘会遮挡屏幕)

3.adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间(可以显示全部屏幕)

4.adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

5.stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

6.stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

7.stateHidden:用户选择activity时,软键盘总是被隐藏

8.stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示

9.sstateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

10.stateVisible:软键盘通常是可见的

下面我们来看一篇关于Swift读取App版本信息 和 PCH 文件的例子,希望这个例子能够对各位有帮助。

 

Swift读取App版本信息

有时间我们需要读取APP的版本信息之类的配置信息,这样的我们可以使用方法:NSBundle.mainBundle().infoDictionary 来获取

Example:
Swift
let infoDictionary = NSBundle.mainBundle().infoDictionary
let shortVersion = infoDictionary!["CFBundleShortVersionString"]
print(shortVersion!)
PCH 文件

PCH文件命名:

一般以项目名称命名,即项目名称是什么,pch文件也叫什么名字。

PCH原理:

PCH文件里面的内容被项目的所有文件共有。

PCH Tips:

1.pch需要提前编译,在工程文件中,找到Build Setting,选择All选项,中找到 Apple LLVM 1.7 – Language集合下的 : Precompile Prefix Header 设置为 Yes ,然后 Prefix Header 选项中写入pch文件的绝对路径,

2.找到Swift Compiler – Code Generation 集合,从中配置Objectie-C的桥接文件:Objective-C Bridging Header ,写入相同的pch文件路径

3.在xcode中按Command+B编译一下
PCH文件作用:
Swift
/*
    首选判断当前有没有C文件,如果有C就不导入OC的语法
    每一个OC文件头部默认都会定义__OBJC__这个宏
*/
#ifdef __OBJC__
/**
 1.存放一些公用的宏
 */
#define PERSIMMON "Mr.Cong"
/**
 2.存放一些公用的头文件
  */
#import "UIImage+Test.h"
/**
 3.自定义一些调试用的NSLog(输出日志)
 ... 表示在宏里面的可变参数
 __VA_ARGS__ 表示函数里面的可变参数
 */
#ifdef DEBUG
#define TLog(...) NSLog(__VA_ARGS__)
#else
#define TLog(...)
#endif

#endif

PCH弊端;

1.每次都需要提前编译
2.需要做一些判断,判断当前有没有C文件,如果有C就不导入OC的语法

下面我们来看一篇关于Android开发使用Netty的TCP连接中使用SSL加密的例子,希望这篇文章能够对各位有所帮助,具体的如下文介绍。

 

1 Introduction
 
数据安全在网络通信中是非常重要的一个方面。为了支持 SSL/TLS,Java 提供了 javax.net.ssl包下的类SslContext 和 SslEngine 。在Netty框架下,I/O数据在ChannelPipeline中被管道中的ChannelHandler处理并转发给下一个ChannelHandler。自然而然地,Netty也提供了ChannelHandler的实现SslHandler来支持SSL, 有一个内部 SslEngine 做实际的工作。
 
2 Steps
 
首先看看SslHandler的构造函数:
   public SslHandler(SSLEngine engine) {
        this(engine, false);
    }

    public SslHandler(SSLEngine engine, boolean startTls) {
        this(engine, startTls, ImmediateExecutor.INSTANCE);
    }
不难发现,我们需要一个SSLEngine对象来构建SslHandler。根据资料可以知道,需要根据已初始化的 SSLContext 来调用 SSLContext.createSSLEngine() 即可创建 SSLEngine。
所以基于Netty框架的在TCP连接中使用SSL/TLS加密的流程如下:
 1.在代码中导入证书,并使用该证书构造SSLContext
2.调用SSLContext对象的createSSLEngine()创建 SSLEngine
3.用SSLEngine对象去初始化Netty的SslHandler
4.在Netty的ChannelInitializer.initChannel()中,往管道(pipeline)中安装SslHandler。
 
3 Usage
 
3.1 导入证书
 public SSLContext getClientSSLContext(){
  KeyStore trustKeyStore= KeyStore.getInstance("JKS");// 访问Java密钥库,JKS是keytool创建的Java密钥库
  InputStream keyStream = MyApplication.getAppContext().getAssets().open("key.jks");//打开证书文件(.jks格式)
  char keyStorePass[]="12345678".toCharArray();  //证书密码
  keyStore .load(trustKeyStore,keyStorePass);


  TrustManagerFactory trustManagerFactory =   TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore );//保存服务端的授权证书

SSLContext   clientContext = SSLContext.getInstance( "TLS");
  clientContext.init(null, trustManagerFactory.getTrustManagers(), null);

  return clientContext;
}
在上述代码,只是实现了client采用trustKeyStore中的key.jks证书(包含了server的公钥)对数据解密,如果解密成功,证明消息来自server,进行逻辑处理。
仅仅是server->client单向的SSL认证。
如果要实现server和client之间双向的身份认证,需要模仿trustManagerFactory的初始化来构建一个KeyManagerFactory来其中保存客户端的私钥,并传入
clientContext.init(kmf.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

具体参照 SSL双向认证java实现
 
3.2 添加 SslHandler
 
ChannelHandler在应该初始化(ChannelInitializer.initChannel()被调用时)阶段被安装在ChannelPipeline中。
 

Bootstrap的介绍参考Android开发之使用Netty进行Socket编程(二)
Boostrap的初始化参考Android开发之使用Netty进行Socket编程(三)
   bootstrap.handler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel ch) throws Exception {
                ChannelPipeline pipeline = ch.pipeline();
                SSLEngine engine = getClientSSLContext().createSSLEngine();
                engine.setUseClientMode(true);
                pipeline.addFirst("ssl", new SslHandler(engine));

                //....再添加其他的ChannelHandler
                pipeline.addLast(nettyChannelHandler);
            }
        });
在大多数情况下,SslHandler 将成为 ChannelPipeline 中的第一个 ChannelHandler,所以调用了pipeline.addFirst() 。这将确保所有其他 ChannelHandler 应用他们的逻辑到数据后加密后才发生,从而确保他们的变化是安全的

下面我们来看一篇关于Android设置viewGroup和其子控件两者之间的焦点关系的例子,希望文章能够让各位了解到viewGroup和其子控件两者之间的关系哦。

在开发过程中,你可能会遇到这样的问题:在一个很长的界面刚初始化结束的时候默认不是最顶部而是某一个控件,比如ListView;也可能遇到Edittext自己弹出软键盘的问题等等。其实这些都是焦点获取的问题,不想有这样的小bug那么就要对焦点的获取问题进行合理的控制。大多数人会在初始化的时候就对某个控件添加这个属性:

×××.setFocusable(false);

其实在建立xml布局文件的时候Android就提供了焦点控制的属性:

android:descendantFocusability="blocksDescendants"

解释一下相应的属性和对应的表达。

该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。

属性的值有三种:


beforeDescendants:viewgroup会优先其子类控件而获取到焦点
 
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
 
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

标签:[!--infotagslink--]

您可能感兴趣的文章: