【发布时间】:2021-08-25 06:49:50
【问题描述】:
我构建了一个在应用程序外部具有浮动按钮的 android 应用程序(例如 Facebook 聊天头信使。问题是当我单击 EditText 或 TextInputEditText 时它没有显示键盘。 我是 android 新手,我不知道我是否可以在应用程序之外执行此操作。但我确信当点击edittext以捕捉键盘上输入的浮点数或字符串时,有一种方法可以打开键盘。 如果有一个解决方案可以让真正的 EditText 在服务中工作,那就太棒了。
@Override
public void onCreate() {
super.onCreate();
//getting the widget layout from xml using layout inflater
mFloatingView = LayoutInflater.from(this).inflate(R.layout.widget_layout, null);
final WindowManager.LayoutParams params;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
} else {
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
}
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
//getting windows services and adding the floating view to it
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mWindowManager.addView(mFloatingView, params);
initView();
nameinput.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
String david = imm.toString();
Toast.makeText(FloatingWidgetService.this, david, Toast.LENGTH_SHORT).show();
}
});
//float button
collapsedView = mFloatingView.findViewById(R.id.layoutCollapsed);
collapsedView.setVisibility(View.VISIBLE);
//extended layout
expandedView = mFloatingView.findViewById(R.id.layoutExpanded);
expandedView.setVisibility(View.GONE);
closelayout.setVisibility(View.GONE);
//close button
mFloatingView.findViewById(R.id.buttonClose).setOnClickListener(this);
expandedView.setOnClickListener(this);
//init
//adding an touchlistener to make drag movement of the floating widget
mFloatingView.findViewById(R.id.relativeLayoutParent).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:
//when the drag is ended switching the state of the widget
expandedView.setVisibility(View.VISIBLE);
closelayout.setVisibility(View.VISIBLE);
return true;
case MotionEvent.ACTION_MOVE:
//this code is helping the widget to move around the screen with fingers
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
mWindowManager.updateViewLayout(mFloatingView, params);
return true;
}
return false;
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
if (mFloatingView != null) mWindowManager.removeView(mFloatingView);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.layoutCollapsed:
expandedView.setVisibility(View.GONE);
break;
case R.id.nameinput:
break;
case R.id.buttonClose:
stopSelf();
break;
case R.id.save:
getparams();
name = nameinput.getText().toString();
textviewtest.setText(name);
break;
case R.id.closelayout:
expandedView.setVisibility(View.GONE);
closelayout.setVisibility(View.GONE);
}
}
【问题讨论】:
-
"WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE" 可能是原因,因为该键盘来自操作系统本身,您不需要触发任何东西,但是您禁用焦点会阻止该文本框或输入框获得焦点将导致“键盘不显示”
-
谢谢。我从 FLAG_NOT_FOCUSABLE 更改为 ALPHA_CHANGED 并修复了所有问题。
标签: java android android-service android-textinputedittext