我正在创建一个 float 的 EditText
,它需要位于所有窗口的顶部。这是我正在使用的代码:
public class FlyingPaste extends Service {
private WindowManager windowManager;
private List<View> bubbles;
private LayoutInflater inflater;
private boolean isbubblexpanded;
private ImageView bubble;
private LinearLayout linearEditor;
private LinearLayout linearBubble;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
inflater = LayoutInflater.from(this);
bubbles = new ArrayList<View>();
isbubblexpanded = false;
Log.d("service","created");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
final View bubbleItem = inflater.inflate(R.layout.flying_paste, null);
Log.d("service","onStartCommand");
ImageView paste = (ImageView) bubbleItem.findViewById(R.id.flying_pasteit);
final EditText pTxt = (EditText)bubbleItem.findViewById(R.id.flying_editText);
pTxt.setFocusableInTouchMode(true);
pTxt.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
return true;
case MotionEvent.ACTION_UP:
pTxt.requestFocusFromTouch();
Log.d("Touch","got"); //HERE THE LOG MESSAGE IS SHOWN BUT NO SOFT KEYBOARD APPEAR xD
return true;
}
return false;
}
});
ImageView minimize = (ImageView)bubbleItem.findViewById(R.id.flying_minimize);
minimize.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
toggleBubble();
}
});
bubble = (ImageView)bubbleItem.findViewById(R.id.flying_bubble);
linearBubble = (LinearLayout)bubbleItem.findViewById(R.id.flying_bubbleLinearLayout);
linearEditor = (LinearLayout)bubbleItem.findViewById(R.id.flying_linearEditor);
bubbleItem.findViewById(R.id.flying_close).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
windowManager.removeView(bubbleItem);
}
});
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
params.gravity = Gravity.CENTER;
bubbleItem.findViewById(R.id.flying_actbar).setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(bubbleItem, params);
return true;
}
return false;
}
});
bubble.setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
if (params.x > (initialX-5)) {
if (params.x < (initialX+5)) {
if (params.y > (initialY-5)) {
if (params.y < (initialY+5)) {
toggleBubble();
}
}
}
}
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(bubbleItem, params);
return true;
}
return false;
}
});
bubble.setVisibility(View.VISIBLE);
linearEditor.setVisibility(View.GONE);
addBubbleItem(bubbleItem, params);
return super.onStartCommand(intent, flags, startId);
}
public void addBubbleItem(View bubbleItem, LayoutParams params) {
bubbles.add(bubbleItem);
windowManager.addView(bubbleItem, params);
Log.d("service","addBubbleItem");
}
public void toggleBubble() {
if (isBubbleExpanded()) {
linearEditor.setVisibility(View.GONE);
linearBubble.setVisibility(View.VISIBLE);
isbubblexpanded = false;
}
else {
linearBubble.setVisibility(View.GONE);
linearEditor.setVisibility(View.VISIBLE);
isbubblexpanded = true;
}
}
private boolean isBubbleExpanded() {
return isbubblexpanded;
}
public void removeBubbleItem(View bubbleItem) {
bubbles.remove(bubbleItem);
windowManager.removeView(bubbleItem);
}
@Override
public void onDestroy() {
super.onDestroy();
for (View bubbleItem : bubbles) {
removeBubbleItem(bubbleItem);
}
}
}
一切正常,除了当我单击 EditText(上面代码中的 pTxt
)时,日志消息 Touch
,got
是显示在控制台中,但 editText 未获得焦点,也未显示 软键盘。任何人都知道如何解决这个问题?提前致谢。
编辑: 我忘了说,如果我删除标志 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
EditText 将按预期工作,但软 后退按钮
则不起作用。
EDIT2:我需要更正自己,EditText 获得了焦点但 SoftInput 键盘没有显示
最佳答案
public static final int TYPE_SYSTEM_OVERLAY 窗口类型:系统覆盖窗口,需要显示在其他所有窗口之上。这些窗口不能获得输入焦点,否则它们会干扰键盘锁。在多用户系统中,仅在拥有用户的窗口中显示。
编辑:
经过几天的研究,我在 XDA 开发人员中找到了一个库,可以帮助我们完成任务。请引用链接.....它确实有效,并且他们提供了大量示例,这将帮助我们轻松理解库功能。
关于android - 无法在 TYPE_SYSTEM_ALERT 窗口中获得焦点并开始编辑 EditText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27488569/