Android 动态加载布局文件

本文转自:Android开发技巧:动态创建UI界面

Android的基本UI界面一般都是在xml文件中定义好,然后通过activity的setContentView来显示在界面上,这是Android UI的最简单的构建方式。为了实现更加复杂和更加灵活的UI界面,往往需要动态生成UI界面,甚至根据用户的点击或者配置,动态改变UI本文即介绍该技巧。

假设Android工程的一个xml文件名为activity_main.xml,定义如下:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView 
        android:id="@+id/DynamicText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout> 

在MainActivity中,希望显示这个简单的界面有三种方式(注:以下 的代码均在MainActivity的onCreate()函数中实现)。

1、直接通过传统的setContentView(R.layout.*)来加载

setContentView(R.layout.activity_main);

TextView text = (TextView)this.findViewById(R.id.DynamicText);
text.setText("Hello world");

2、通过LayoutInflater来间接加载

LayoutInflater mInflater = LayoutInflater.from(this);
View contentView = mInflater.inflate(R.layout.activity_main,null);

TextView text = (TextView)contentView.findViewById(R.id.DynamicText);
text.setText("Hello world");

setContentView(contentView);

注意:LayoutInflater相当于一个“布局加载器”,有三种方式可以从系统中获取到该布局加载器对象,如下

  • LayoutInflater.from(this);
  • (LayoutInflater)this.getSystemService(this.Layout_INFLATER_SERVICE);
  • this.getLayoutInflater();

通过该对象的inflate方法可以将指定的xml文件加载转换为View类对象,该xml文件中的控件的对象,都可以通过该View对象的findViewById方法获取。

3、纯粹手工创建UI界面

xml文件中的任何标签,都是有相应的类来定义的。因此,我们完全可以不使用xml文件,纯粹地动态创建所需的UI界面,如下:

LinearLayout layout= new LinearLayout(this);

TextView text = new TextView(this);
text.setText("Hello world");
text.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

layout.addView(text);
setContentView(layout);

Android开发中软键盘常见问题

本文转自:http://www.cnblogs.com/itrena/p/5938210.html

软键盘显示原理

软键盘本质是什么呢?软件盘其实是一个Dialog。
InputMethodService为我们的输入法创建一个Dialog,并且将该Dialog的Window的默写参数(如Gravity)进行了设置,使之能够在底部或者全屏显示。当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或全屏显示。

软键盘显示的调整

android定义了一个属性,名字为windowSoftInputMode,这个属性用于设置Activity主窗口与软键盘的交互模式,用于避免软键盘遮挡内容的问题。我们可以在AndroidManifest.xml中对Activity进行设置。如:android:windowSoftInputMode=”stateUnchanged|adjustPan”。

该属性可选的值有两部分,一部分为软键盘的状态控制,控制软键盘是隐藏还是显示,另一部分是Activity窗口的调整,一遍腾出控件展示软键盘。

  • stateUnspecified(未指定状态):当我们没有设置windowSoftInputMode属性的时候,软件默认采用的就是这种交互方式,系统会根据界面采取相应的软键盘的显示模式。
  • stateUnchanged(不可改变状态):当前界面的软键盘状态,取决于上一个界面的软键盘状态,无论是隐藏还是显示。
  • stateHidden(隐藏状态):当设置该状态时,软键盘总是被隐藏,不管是否有输入的需求。
  • stateAlwaysHidden(总是隐藏状态):当设置该状态是,软键盘总是被隐藏,和stateHidden不同的是,当我们跳转到下个界面,如果下个页面的软键盘是显示的,而我们再次回来的时候,软键盘就会隐藏起来。
  • stateVisible(可见状态):当设置为这个状态是,软键盘总是可见的,即使在界面上没有输入框的情况下也可以强制弹出来。
  • stateAlwaysVisible(总是显示状态):当设置为这个状态时,软键盘总是可见的,和stateVisible不同的是,当我们跳转到下个界面,如果下个页面软键盘是隐藏的,而我们再次回来的时候,软键盘就会显示出来。
  • adjustUnspecified(未指定模式):设置软键盘与软件的显示内容之间的显示关系,当你跟我们没有设置这个值的时候,这个选项也是默认的设置模式。在这种情况下,系统会根据界面选择不同的模式。
  • adjustResize(调整模式):该模式下窗口总是调整屏幕的大小,用于保证软键盘的显示控件,这个选项不能和adjustPan同时使用。如果这两个属性都没有被设置,系统会根据窗口中的布局自动选择其中一个。
  • adjustPan(默认模式):该模式下不会调整来保证软键盘的控件,而是采取了另外一种策略,系统会通过布局的移动,来保证用户要进行输入的输入框肯定在用户的视野范围内,从而让用户可以看到自己输入的内容。

Android 设置横竖屏,禁止屏幕旋转,禁止旋转后Activity重置

在没有设置禁止手机旋转时,Android App在会随着手机的旋转切换横\竖屏。但很多时候我们希望App 旋转,以下归纳集中方法:

1、AndroidManifest.xml文件中设置Activity属性

横屏:android:screenOrientation=”landscape”
竖屏:android:screenOrientation=”portrait”

2、Activity代码文件中设置

横屏:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
竖屏:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

另外在允许屏幕旋转的时候,App会重置Activity的onCreate,导致一些不必要的错误。下面方法可以禁止Activity重置。

AndroidManifest.xml中,Activity添加属性android:configChanges=”orientation”