【问题标题】:EditText or InputText not working, create input method to get a string randomlyEditText 或 InputText 不起作用,创建输入法以随机获取字符串
【发布时间】: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


【解决方案1】:

“WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE”可能是原因,因为该键盘来自操作系统本身,您不需要触发任何东西,但是您禁用聚焦将阻止该文本框或输入框获得焦点,这将导致“键盘不显示”

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 2011-10-28
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2019-11-03
    • 2011-03-15
    相关资源
    最近更新 更多