当前位置: 编程技术>移动开发
本页文章导读:
▪在工作线程中创造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();
}
}
}
最新技术文章: