工作中有一个界面刚进入时要弹出一个popupwindow,里面有键盘,结果直接模拟点击事件不起作用,还报错,
12-26 17:01:08.636: D/CrashHandler(1795):
android.view.WindowManager$BadTokenException: Unable to add window
-- token null is not valid; is your activity running?
12-26 17:01:08.636: D/CrashHandler(1795): at
android.view.ViewRoot.setView(ViewRoot.java:505)
12-26 17:01:08.636: D/CrashHandler(1795): at
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
12-26 17:01:08.636: D/CrashHandler(1795): at
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
12-26 17:01:08.636: D/CrashHandler(1795): at
android.view.Window$LocalWindowManager.addView(Window.java:424)
12-26 17:01:08.636: D/CrashHandler(1795): at
android.widget.Popupwindows.invokePopup(PopupWindow.java:828)
12-26 17:01:08.636: D/CrashHandler(1795): at
android.widget.PopupWindow.showAtLocation(PopupWindow.java:688)
12-26 17:01:08.636: D/CrashHandler(1795): at
com.jiuqi.muchmore.clothing.view.keyboard.OnClickListenerForKeyboard.onClick(OnClickListenerForKeyboard.java:258)
12-26 17:01:08.636: D/CrashHandler(1795): at
android.view.View.performClick(View.java:2408)
把它加到异步任务中,等待一会(500毫秒)就正常了,百思不得其解。
弹出方法最后考达内的一篇文章做了下试验,解决了。
布局文件:showime.xml
encoding="utf-8"?>
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical" >
android:id="@+id/ButtonIME"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5px"
android:text="弹出软键盘输入法" />
android:id="@+id/EditTextIME"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5px"
android:text="显示输入法键盘22" />
java源码:ShowIME.java
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class ShowIME extends Activity{
private EditText et;
private Button bt;
private static Handler messageHandler;
@Override
public void onCreate(Bundle
savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.showime);
bt =
(Button)findViewById(R.id.ButtonIME);
bt.setOnClickListener(new
OnClickListener(){
@Override
public void
onClick(View v){
et.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN,
et.getLeft() + 5, et.getTop() + 5, 0));
et.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,
et.getLeft() + 5, et.getTop() + 5, 0));
}
});
et =
(EditText)findViewById(R.id.EditTextIME);
PopupKeyboardAsync t = new
PopupKeyboardAsync();
t.execute();
// et.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN,
et.getLeft()+5, et.getTop()+5, 0));
// et.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, et.getLeft()+5,
et.getTop()+5, 0));
// Looper looper =
Looper.myLooper();
// messageHandler = new
MessageHandler(looper);
// //此处的作用是延迟1秒,然后激活点击事件
// new Thread(){
// @Override
// public void
run(){
// synchronized(this){
// try{
// wait(1000);
//1秒
// }
// catch(InterruptedException
e){
// e.printStackTrace();
// }
// }
// Message
message = Message.obtain();
// message.what
= 1;
// messageHandler.sendMessage(message);
// }
// }.start();
}
class PopupKeyboardAsync extends AsyncTask {
@Override
protected Void doInBackground(Void... params){
synchronized(this){
try{
wait(500);
//0.5秒
}
catch(InterruptedException
e){
e.printStackTrace();
}
}
return null;
}
@Override
protected void
onPostExecute(Void result){
et.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN,
et.getLeft()+5, et.getTop()+5, 0));
et.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, et.getLeft()+5,
et.getTop()+5, 0));
}
}
class MessageHandler extends Handler{
public MessageHandler(Looper
looper){
super(looper);
}
@Override
public void
handleMessage(Message msg){
Bundle bundle
= msg.getData();
switch(msg.what){
case
1:
//模拟点击按钮
// bt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN,
// et.getLeft() + 5, et.getTop() + 5, 0));
// bt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,
// et.getLeft() + 5, et.getTop() + 5, 0));
//以下代码模拟点击文本编辑框
et.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN,
et.getLeft()+5, et.getTop()+5, 0));
et.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, et.getLeft()+5,
et.getTop()+5, 0));
break;
default:
break;
}
}
}
}
其他参考: