Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 显示键盘时,即使在对话框窗口上使用“软输入”\u“调整”\u“调整大小”,我的自定义视图对话框片段也不会调整大小_Android_Android Layout - Fatal编程技术网

Android 显示键盘时,即使在对话框窗口上使用“软输入”\u“调整”\u“调整大小”,我的自定义视图对话框片段也不会调整大小

Android 显示键盘时,即使在对话框窗口上使用“软输入”\u“调整”\u“调整大小”,我的自定义视图对话框片段也不会调整大小,android,android-layout,Android,Android Layout,我有以下自定义视图DialogFragment 当我点击编辑文本时,显示软键盘。目前,观察结果如下: 对话框的位置有点“向上推” 对话框未调整大小,对话框内容被阻止。 这就是它的样子 我不希望对话内容被键盘覆盖。我已根据要求进行了修改 不过,这一点也没用 我也试过了 dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutPara

我有以下自定义视图
DialogFragment

当我点击编辑文本时,显示软键盘。目前,观察结果如下:

  • 对话框的位置有点“向上推”
  • 对话框未调整大小,对话框内容被阻止。
  • 这就是它的样子

    我不希望对话内容被键盘覆盖。我已根据要求进行了修改

    不过,这一点也没用

    我也试过了

    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    
    这没什么区别。对话框未调整大小,对话框内容被阻止。除此之外,软键盘将在第一次显示时立即显示,无需用户立即点击
    EditText

    我可以知道,当显示软键盘时,如何调整我的
    对话框的大小?


    更新 我做了一个实验,将相同的XML布局文件应用于一个活动。
    活动的大小调整没有问题

    似乎XML布局文件本身没有问题。

    我使用的软输入模式是

    <activity android:name="org.yccheok.jstock.gui.trading.sign_in.SignInFragmentActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize|stateAlwaysVisible" />
    
    布局XML
    经过一些调试,我意识到这是由

  • 不需要调用设置对话框高度的
    makeDialogShorter
  • 无需在onGlobalLayout期间调整软输入
  • 这是我的解决办法。我重构代码以使用
    onCreateView
    而不是
    onCreateDialog
    ,从而使代码更短、更简单

    package org.yccheok.jstock.gui.trading.sign_in;
    
    import android.os.Bundle;
    import android.support.v4.app.DialogFragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;
    import android.widget.Button;
    
    import org.yccheok.jstock.gui.R;
    
    /**
     * Created by yccheok on 8/1/2018.
     */
    
    public class SignInDialogFragment extends DialogFragment {
    
        public static SignInDialogFragment newInstance() {
            SignInDialogFragment signInDialogFragment = new SignInDialogFragment();
            return signInDialogFragment;
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            final View view = inflater.inflate(R.layout.trading_sign_in_fragment, container);
    
            Button forgotPasswordButton = (Button)view.findViewById(R.id.forgot_password_button);
            Button signInButton = (Button)view.findViewById(R.id.sign_in_button);
    
            forgotPasswordButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                }
            });
    
            signInButton.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View view) {
                }
            });
    
            signInButton.setEnabled(false);
    
    
            //set to adjust screen height automatically, when soft keyboard appears on screen
            getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    
            return view;
        }
    }
    
    结果是这样的


    我们现在有一个简短可爱的小对话框:)

    使对话框根换行内容,并检查在调整大小时是否使用了AdjustPan?
    AdjustPan
    没有帮助。显示键盘时,对话框的内容仍然是块。
    package org.yccheok.jstock.gui.trading.sign_in;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.app.Dialog;
    import android.os.Bundle;
    import android.support.design.widget.TextInputLayout;
    import android.support.v4.app.DialogFragment;
    import android.support.v4.app.Fragment;
    import android.support.v7.app.AlertDialog;
    import android.util.DisplayMetrics;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.ViewTreeObserver;
    import android.view.WindowManager;
    import android.widget.Button;
    
    import org.yccheok.jstock.gui.R;
    
    /**
     * Created by yccheok on 8/1/2018.
     */
    
    public class SignInDialogFragment extends DialogFragment {
    
        public static SignInDialogFragment newInstance() {
            SignInDialogFragment signInDialogFragment = new SignInDialogFragment();
            return signInDialogFragment;
        }
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            final Activity activity = getActivity();
    
            // Get the layout inflater
            LayoutInflater inflater = LayoutInflater.from(activity);
    
            final View view = createView(this, inflater, null);
    
            final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    
            final AlertDialog dialog = builder.setView(view).create();
    
            dialog.setCanceledOnTouchOutside(true);
    
            final ViewTreeObserver vto = view.getViewTreeObserver();
            vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    
                @SuppressLint("NewApi")
                @SuppressWarnings("deprecation")
                @Override
                public void onGlobalLayout() {
                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
                        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    } else {
                        view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    }
    
                    makeDialogShorter(dialog);
                    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
                }
            });
    
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    
            return dialog;
        }
    
        private static View createView(final Fragment fragment, final LayoutInflater inflater, final ViewGroup container) {
            View v = inflater.inflate(R.layout.trading_sign_in_fragment, container, false);
    
            Button forgotPasswordButton = (Button)v.findViewById(R.id.forgot_password_button);
            Button signInButton = (Button)v.findViewById(R.id.sign_in_button);
    
            forgotPasswordButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                }
            });
    
            signInButton.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View view) {
                }
            });
    
            signInButton.setEnabled(false);
    
            return v;
        }
    
        private static void makeDialogShorter(Dialog dialog) {
            // http://stackoverflow.com/questions/19326142/why-listview-expand-collapse-animation-appears-much-slower-in-dialogfragment-tha
            int width = dialog.getWindow().getDecorView().getWidth();
    
            DisplayMetrics displayMetrics = new DisplayMetrics();
            dialog.getOwnerActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
            int height = displayMetrics.heightPixels;
    
            height = Math.min(
                    (int)(height * 4.0 / 5.0),
                    dialog.getWindow().getDecorView().getHeight()
            );
    
            if (height > width) {
                dialog.getWindow().setLayout(width, height);
            }
        }
    }
    
    <?xml version="1.0" encoding="utf-8"?>
    <ViewAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/view_animator"
        android:animateFirstView="false"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    
        <RelativeLayout
            android:id="@+id/sign_in_relative_layout"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingTop="@dimen/trading_activity_vertical_margin"
                android:paddingBottom="0dp"
                android:layout_above="@+id/sign_in_bottom_nav_bar">
    
                <android.support.design.widget.TextInputLayout
                    android:layout_marginLeft="@dimen/trading_activity_horizontal_margin"
                    android:layout_marginRight="@dimen/trading_activity_horizontal_margin"
    
                    app:hintTextAppearance="@style/TradingWizardTextInputLayout"
                    android:id="@+id/username_text_input_layout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >
                    <android.support.design.widget.TextInputEditText
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:hint="@string/wizard_username"
                        android:id="@+id/username_edit_text"
    
                        android:inputType="textVisiblePassword|textNoSuggestions"
                        android:imeOptions="actionNext|flagNoExtractUi" />
                </android.support.design.widget.TextInputLayout>
    
                <android.support.design.widget.TextInputLayout
                    android:layout_marginLeft="@dimen/trading_activity_horizontal_margin"
                    android:layout_marginRight="@dimen/trading_activity_horizontal_margin"
    
                    app:hintTextAppearance="@style/TradingWizardTextInputLayout"
                    app:passwordToggleEnabled="true"
                    android:id="@+id/password_text_input_layout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >
                    <android.support.design.widget.TextInputEditText
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:hint="@string/wizard_password"
                        android:id="@+id/password_edit_text"
    
                        android:inputType="textPassword"
                        android:imeOptions="actionNext|flagNoExtractUi" />
                </android.support.design.widget.TextInputLayout>
    
            </LinearLayout>
    
            <Button
                style="?android:attr/buttonBarButtonStyle"
                android:id="@+id/forgot_password_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:layout_gravity="center"
                android:enabled="true"
                android:textAllCaps="false"
                android:text="@string/forgot_password"
                android:textSize="16sp"
                android:layout_above="@+id/sign_in_bottom_nav_bar"
                android:layout_centerHorizontal="true"
    
                android:layout_marginBottom="8dp"
                android:paddingLeft="32dp"
                android:paddingRight="32dp" />
    
            <LinearLayout
                android:background="?attr/welcomeBottomNavBarBackground"
                android:orientation="horizontal"
                android:id="@+id/sign_in_bottom_nav_bar"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true">
                <Button
                    style="?android:attr/buttonBarButtonStyle"
                    android:background="?attr/selectableItemBackground"
    
                    android:id="@+id/sign_in_button"
                    android:layout_width="0dp"
                    android:width="0dp"
                    android:layout_weight="1.0"
                    android:layout_height="48dp"
                    android:gravity="center"
                    android:layout_gravity="center"
                    android:enabled="true"
                    android:textAllCaps="true"
                    android:text="@string/log_in" />
            </LinearLayout>
        </RelativeLayout>
    </ViewAnimator>
    
    package org.yccheok.jstock.gui.trading.sign_in;
    
    import android.os.Bundle;
    import android.support.v4.app.DialogFragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;
    import android.widget.Button;
    
    import org.yccheok.jstock.gui.R;
    
    /**
     * Created by yccheok on 8/1/2018.
     */
    
    public class SignInDialogFragment extends DialogFragment {
    
        public static SignInDialogFragment newInstance() {
            SignInDialogFragment signInDialogFragment = new SignInDialogFragment();
            return signInDialogFragment;
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            final View view = inflater.inflate(R.layout.trading_sign_in_fragment, container);
    
            Button forgotPasswordButton = (Button)view.findViewById(R.id.forgot_password_button);
            Button signInButton = (Button)view.findViewById(R.id.sign_in_button);
    
            forgotPasswordButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                }
            });
    
            signInButton.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View view) {
                }
            });
    
            signInButton.setEnabled(false);
    
    
            //set to adjust screen height automatically, when soft keyboard appears on screen
            getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    
            return view;
        }
    }