输入长文本后,带有自定义视图的AlertDialog在软键盘后面消失

时间:2019-07-29 14:51:29

标签: java android xml android-alertdialog

我有一个使用自定义AlertDialog的简单View

enter image description here

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="20dp"
    android:layout_alignParentTop="true">

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Enter a comment"
    android:linksClickable="true"
    android:background="@android:color/transparent"
    android:inputType="textMultiLine"
    android:scrollbars="vertical"/>

<HorizontalScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"

    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:orientation="horizontal"
        android:gravity="center"
        >

        <ImageView
            android:id="@+id/imageview_bold"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_margin="10dp"
            android:src="@drawable/bold_b" />

        <ImageView
            android:id="@+id/imageview_italic"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_margin="10dp"
            android:src="@drawable/italic_i" />


        <ImageView
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:id="@+id/imageview_underlined"
            android:layout_margin="10dp"
            android:src="@drawable/underlined_u"/>


        <ImageView
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:id="@+id/add_link"
            android:layout_margin="10dp"
            android:src="@mipmap/ic_launcher_link"/>


    </LinearLayout>

</HorizontalScrollView>

</LinearLayout>

问题

长文本导致AlertDialog隐藏在软键盘后面。 enter image description here

FormattingBar B I U链接)也被隐藏,并且只有短文本可见。

AlertDialog应该始终停留在软键盘上,如果文本太长,EditText必须是可滚动的,但是 FormattingBar 和{{1 }}按钮应始终可见。

enter image description here

我该怎么做?

我已经尝试过类似的东西

AlertDialog

android:fitsSystemWindows="true"

android:windowSoftInputMode="adjustResize"

但没有任何效果。

使用android:windowSoftInputMode="adjustPan"会导致不同设备出现问题。 maxlines的数量各不相同。

3 个答案:

答案 0 :(得分:0)

您需要对{strong> setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)

使用AlertDialog

示例代码

  

活动

import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.WindowManager
import androidx.appcompat.app.AlertDialog

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        showAlertDialog(this)

    }

    private fun showAlertDialog(
            context: Context
    ) {
        val dialogBuilder = AlertDialog.Builder(context)

        dialogBuilder.setView(R.layout.aa)

        val dialog = dialogBuilder.create()
        dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
        dialog.show()
    }

}
  

对话框布局文件

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fillViewport="true"
    android:orientation="vertical"
    android:scrollbars="vertical"
    android:padding="20dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="20dp">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            android:hint="Enter a comment"
            android:inputType="textMultiLine"
            android:linksClickable="true"
            android:scrollbars="vertical" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="10dp"
            android:gravity="center"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/imageview_bold"
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_margin="10dp"
                android:src="@mipmap/ic_launcher_round" />

            <ImageView
                android:id="@+id/imageview_italic"
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_margin="10dp"
                android:src="@mipmap/ic_launcher_round" />


            <ImageView
                android:id="@+id/imageview_underlined"
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_margin="10dp"
                android:src="@mipmap/ic_launcher_round" />


            <ImageView
                android:id="@+id/add_link"
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_margin="10dp"
                android:src="@mipmap/ic_launcher_round" />


        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_margin="10dp"
                android:src="@mipmap/ic_launcher_round" />

            <ImageView
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_margin="10dp"
                android:src="@mipmap/ic_launcher_round" />


            <ImageView
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_margin="10dp"
                android:src="@mipmap/ic_launcher_round" />


            <ImageView
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_margin="10dp"
                android:src="@mipmap/ic_launcher_round" />


        </LinearLayout>

    </LinearLayout>

</ScrollView>

答案 1 :(得分:0)

您的问题是inputType

删除该行,然后尝试使用此代码

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Enter a comment"
    android:background="@android:color/transparent"
    android:maxHeight="90dp"/>

更新

edittext.setScroller(new Scroller(myContext));
edittext.setMaxLines(5);
edittext.setVerticalScrollBarEnabled(true);
edittext.setMovementMethod(new ScrollingMovementMethod());

通过这种方法,您可以获得键盘的动态高度,并且可以基于屏幕的总高度来设置edittext的静态高度%

root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
     public void onGlobalLayout(){
           int heightDiff = root.getRootView().getHeight()- root.getHeight();
           // IF height diff is more then 150, consider keyboard as visible.  
        }
  });

仅在android:windowSoftInputMode="adjustResize"

下有效

答案 2 :(得分:0)

尝试以下解决方案:

  1. 通过将以下方法添加到活动类中来获取设备的高度

    public int getHeight(){
    
       DisplayMetrics displayMetrics = new DisplayMetrics();
       getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
       int height = displayMetrics.heightPixels;
       return height;
    }
    
  2. 根据设备高度设置MaxHeight,这样就可以通过将此代码块添加到onCreate()方法中,从而在较大的设备(如平板电脑)上不会造成任何问题。

     EditText editText = findViewById(R.id.editText); //The EditText in the Layout
     editText.setMaxHeight(getHeight()/3); //
    

XML可以,但是不要忘记将id添加到editText