项目中需要在ListView中嵌套EditText,但是出现的问题是:点击EditText时,输入框可以输入值,但是一点击返回按钮,输入框的值就会消失,无法保存。
在网上查看了各位大侠的文章之后,发现这个布局会出现各种问题,但我这里出现的问题很简单,经过半个小时的努力,终于找到了解决办法:
1、在EditText中设置属性就OK了
android:layout_height="fill_parent"
但是此问题解决太过顺利,估计后期还会出现问题,后续如果遇到问题,会慢慢补充。
2、将ListView Item(adapter)的布局文件贴出来标记一下
<?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:background="@color/white" > <ImageView android:id="@+id/img" android:layout_width="50dp" android:layout_height="50dp" android:layout_margin="5dp" /> <LinearLayout android:id="@+id/centertext" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/img" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000000" android:textSize="22dp" /> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" > <TextView android:id="@+id/goodnumber" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000000" android:textSize="16sp" /> <EditText android:id="@+id/numberText" android:layout_width="40dip" android:layout_height="fill_parent" android:paddingLeft="8dip" android:paddingRight="8dip" android:paddingTop="5dip" android:paddingBottom="5dip" android:singleLine="true" android:textColorHint="#AAAAAA" android:textSize="18sp" android:layout_gravity="center" android:layout_marginLeft="0dip" android:imeOptions="actionNext" android:ellipsize="end" android:phoneNumber="true" /> </LinearLayout> </LinearLayout> </RelativeLayout>
一、 在startActivity(intent)后调用overridePendingTransition()方法 例如: startActivity(intent); overridePendingTransition(0, 0); // 删除activity跳转动画,模拟tab功能 但有个缺陷,只能定义进入动画,不能定义退出动画,你可以按返回键试一下. 二、 用xml文件 1、在res文件夹下建文件anim, 在anim下建文件 push_up_in.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="300"/> <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /> </set> 2、在values文件夹下建文件 styles.xml <?xml version="1.0" encoding="utf-8"?> <resources> <style name="AnimationActivity" mce_bogus="1" parent="@android:style/Animation.Activity"> <item name="android:activityOpenEnterAnimation">@anim/push_up_in</item> <item name="android:activityOpenExitAnimation">@anim/push_up_in</item> <item name="android:activityCloseEnterAnimation">@anim/push_up_in</item> <item name="android:activityCloseExitAnimation">@anim/push_up_in</item> </style> <style name="ThemeActivity" mce_bogus="1"> <item name="android:windowAnimationStyle">@style/AnimationActivity</item> <item name="android:windowNoTitle">true</item> </style> </resources> 3、在AndroidManifest.xml的application节点接加入属性 android:theme="@style/ThemeActivity"
为什么要使用AsyncTask?
在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则:
1. 不要阻塞UI线程
2. 确保只在UI线程中访问Android UI工具包
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText()的.因为其他线程中是不能直接访问主UI线程成员 。
android提供了几种在其他线程中访问UI线程的方法。
Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
这些类或方法同样会使你的代码很复杂很难理解。然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。
为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
AsyncTask的执行分为四个步骤:
每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。
1) 子类化AsyncTask
2) 实现AsyncTask中定义的下面一个或几个方法
onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
为正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。
转自:http://blog.csdn.net/furongkang/article/details/6998734