当前位置: 编程技术>移动开发
本页文章导读:
▪在工作线程中创造Toast 在工作线程中创建Toast
在工作线程中创建Toast,代码如下:
private void showToast() {
new Thread() {
public void run() {
Looper.prepare();
Toast.makeText(ActivityA.this, "来自工作线程",
Toast.LENGTH_.........
▪ 避免Menu键被障蔽 避免Menu键被屏蔽
大学毕业一年多了,最近忙于Android集群对讲项目开发,很少写博客,由于是第一次从事Android开发,这个项目已发布了几个稳定的版本,心理也特有成就感,感觉自.........
▪ 遍历项目文件夹上的所有文件 遍历项目文件夹下的所有文件
package com.huawei.test;import java.io.File;import java.io.FileOutputStream;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.Output.........
[1]在工作线程中创造Toast
来源: 互联网 发布时间: 2014-02-18
在工作线程中创建Toast
在工作线程中创建Toast,代码如下:
private void showToast() {
new Thread() {
public void run() {
Looper.prepare();
Toast.makeText(ActivityA.this, "来自工作线程",
Toast.LENGTH_SHORT).show();
Looper.loop();
}
}.start();
}
如果不加Looper.prepare();则会出现以下异常:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
所以 在工作线程中创建Toast 须创建Looper对象。Looper.prepare();会创建当前线程的Looper对象和对应的MessageQueue(消息队列)
请参看Toast.java源码。
Toast.java 包含 这句代码:final Handler mHandler = new Handler();
mHandler是Toast的一个final类型的成员变量,在Handler的构造方法中有如下代码:
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called
Looper.prepare()");
}
创建了Toast对象后,调用show()方法,把mShow这个Runnable添加到工作线程的消息队列中,
消息队列是在创建Looper对象的时候创建好的。
如代码:
final Runnable mShow = new Runnable() {
public void run() {
handleShow();
}
};
public void show() {
if (localLOGV) Log.v(TAG, "SHOW: " + this);
mHandler.post(mShow);
}
/**
* Causes the Runnable r to be added to the message queue.
* The runnable will be run on the thread to which this handler is
* attached.
*
*/
public final boolean post(Runnable r)
{
return sendMessageDelayed(getPostMessage(r), 0);
}
此时调用Looper.loop(),从消息队列中取出消息,并执行。
主要源码:
/**
* Run the message queue in this thread. Be sure to call
* {@link #quit()} to end the loop.
*/
public static final void loop() {
Looper me = myLooper();
MessageQueue queue = me.mQueue;
while (true) {
Message msg = queue.next(); // might block
......
msg.target.dispatchMessage(msg);
......
msg.recycle();
}
}
}
此时会调用:mShow的handleShow();
源码:
public void handleShow() {
if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView
+ " mNextView=" + mNextView);
if (mView != mNextView) {
// remove the old view if necessary
handleHide();
mView = mNextView;
mWM = WindowManagerImpl.getDefault();
final int gravity = mGravity;
mParams.gravity = gravity;
if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) ==
Gravity.FILL_HORIZONTAL) {
mParams.horizontalWeight = 1.0f;
}
if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) ==
Gravity.FILL_VERTICAL) {
mParams.verticalWeight = 1.0f;
}
mParams.x = mX;
mParams.y = mY;
mParams.verticalMargin = mVerticalMargin;
mParams.horizontalMargin = mHorizontalMargin;
if (mView.getParent() != null) {
if (localLOGV) Log.v(
TAG, "REMOVE! " + mView + " in " + this);
mWM.removeView(mView);
}
if (localLOGV) Log.v(TAG, "ADD! " + mView + " in " + this);
mWM.addView(mView, mParams);
}
}
mWM.addView(mView, mParams);把Toast对应的view添加到当前Window中。
举一反三:
基于以上原理,可以实现这样的效果,拖动GridView里的ImageView元素,改变元素在GridView的位置。
[2] 避免Menu键被障蔽
来源: 互联网 发布时间: 2014-02-18
避免Menu键被屏蔽
大学毕业一年多了,最近忙于Android集群对讲项目开发,很少写博客,由于是第一次从事Android开发,这个项目已发布了几个稳定的版本,心理也特有成就感,感觉自己学习能力还是挺强的,但是也遇到了许多小问题。在Activity中重写onKeyDown方法,Menu键被屏蔽但HOME键未被屏蔽,其中还HOME屏蔽在我的另外一篇博客中已详细介绍,下面来解决Menu键被屏蔽,让其中MENU键有效。
大学毕业一年多了,最近忙于Android集群对讲项目开发,很少写博客,由于是第一次从事Android开发,这个项目已发布了几个稳定的版本,心理也特有成就感,感觉自己学习能力还是挺强的,但是也遇到了许多小问题。在Activity中重写onKeyDown方法,Menu键被屏蔽但HOME键未被屏蔽,其中还HOME屏蔽在我的另外一篇博客中已详细介绍,下面来解决Menu键被屏蔽,让其中MENU键有效。
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
super.openOptionsMenu();
}
return true;
}
[3] 遍历项目文件夹上的所有文件
来源: 互联网 发布时间: 2014-02-18
遍历项目文件夹下的所有文件
package com.huawei.test;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
public class InsertElement {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//递归项目文件夹下的所有文件夹及其中文件
File root = new File("E:\\eclipse3.6space\\Task");
showAllFiles(root);
}
final static void showAllFiles(File dir) throws Exception{
File[] fs = dir.listFiles();
for(int i=0; i<fs.length; i++){
if(fs[i].getAbsolutePath().contains("strings.xml")
&& !fs[i].getAbsolutePath().contains("large")){
System.out.println(fs[i].getAbsolutePath());
}
if(fs[i].isDirectory()){
try{
showAllFiles(fs[i]);
}catch(Exception e){}
}
}
try {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
SAXReader reader = new SAXReader();
Document document = reader.read("C:\\Users\\Administrator\\Desktop\\strings.xml");
Element root = document.getRootElement();
List<Element> elements = root.elements();
int index = 0;
for(Element element:elements){
index++;
if("app_name".equals(element.attributeValue("name"))){
Element elem = DocumentHelper.createElement("string");
elem.addAttribute("name", "bbb");
elem.setText("ppppppp");
// elem.addAttribute("name", "ccc");
elements.add(index,elem);
break;
}
}
OutputFormat format1 = OutputFormat.createPrettyPrint();//缩减型格式
//OutputFormat format = OutputFormat.createCompactFormat();//紧凑型格式
format1.setEncoding("utf-8");//设置编码
// //format.setTrimText(false);//设置text中是否要删除其中多余的空格
org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(
new FileOutputStream( new File("C:\\Users\\Administrator\\Desktop\\strings.xml")),format1);
// XMLWriter writer = new XMLWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\strings.xml"),format);
xmlWriter.write(document);
xmlWriter.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.huawei.test;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
public class InsertElement {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//递归项目文件夹下的所有文件夹及其中文件
File root = new File("E:\\eclipse3.6space\\Task");
showAllFiles(root);
}
final static void showAllFiles(File dir) throws Exception{
File[] fs = dir.listFiles();
for(int i=0; i<fs.length; i++){
if(fs[i].getAbsolutePath().contains("strings.xml")
&& !fs[i].getAbsolutePath().contains("large")){
System.out.println(fs[i].getAbsolutePath());
}
if(fs[i].isDirectory()){
try{
showAllFiles(fs[i]);
}catch(Exception e){}
}
}
try {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
SAXReader reader = new SAXReader();
Document document = reader.read("C:\\Users\\Administrator\\Desktop\\strings.xml");
Element root = document.getRootElement();
List<Element> elements = root.elements();
int index = 0;
for(Element element:elements){
index++;
if("app_name".equals(element.attributeValue("name"))){
Element elem = DocumentHelper.createElement("string");
elem.addAttribute("name", "bbb");
elem.setText("ppppppp");
// elem.addAttribute("name", "ccc");
elements.add(index,elem);
break;
}
}
OutputFormat format1 = OutputFormat.createPrettyPrint();//缩减型格式
//OutputFormat format = OutputFormat.createCompactFormat();//紧凑型格式
format1.setEncoding("utf-8");//设置编码
// //format.setTrimText(false);//设置text中是否要删除其中多余的空格
org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(
new FileOutputStream( new File("C:\\Users\\Administrator\\Desktop\\strings.xml")),format1);
// XMLWriter writer = new XMLWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\strings.xml"),format);
xmlWriter.write(document);
xmlWriter.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最新技术文章: