2017-10-14 151 views
4

查询描述:我使用透明主题的自定义进度对话框。这工作正常。我面临的问题是,当我的键盘打开时,如果我显示自定义进度对话框,然后它强制关闭我的键盘。但是,如果我使用默认的进度对话框,那么它工作正常。自定义进度对话框隐藏软键盘android

Here is Default Progress Dialog:正如您所看到的,即使进度对话框出现后键盘仍然存在。 我想在自定义进度对话框中实现相同的功能。

Here is Custom Progress Dialog:正如您所看到的,当对话框显示时,键盘会消失。每次用户必须打开键盘时,感觉都很乏味。

这里是我的代码:

public class CustomProgressDialog extends Dialog { 
private ImageView imageView; 
private Context mContext; 

public CustomProgressDialog(Context context) { 
    super(context, R.style.DialogTheme); 
    mContext = context; 
    getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
    WindowManager.LayoutParams wlmp = getWindow().getAttributes(); 
    wlmp.gravity = Gravity.CENTER_HORIZONTAL; 
    getWindow().setAttributes(wlmp); 
    setTitle(null); 
    setCancelable(true); 
    //setOnCancelListener(null); 
    LinearLayout layout = new LinearLayout(context); 
    layout.setOrientation(LinearLayout.VERTICAL); 
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(200, 200); 
    imageView = new ImageView(context); 
    imageView.setBackgroundResource(R.drawable.custom_dialog); 
    layout.addView(imageView, params); 
    addContentView(layout, params); 
} 

@Override 
public void show() { 
    super.show(); 
    AnimationDrawable frameAnimation = (AnimationDrawable) imageView.getBackground(); 
    frameAnimation.start(); 
} 

@Override 
public void dismiss() { 
    super.dismiss(); 
} 
} 

对话主题style.xml:

<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog"> 
    <item name="colorAccent">@color/actionbar_gradient_endColor</item> 
</style> 

任何帮助将不胜感激。

<EditText android:id="@+id/et_search_category" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_toLeftOf="@+id/imgClearSearch" 
    android:background="@drawable/rounded_rdt_txt" 
    android:hint="Search here..." 
    android:layout_centerVertical="true" 
    android:singleLine="true" /> 
+0

@YvetteColomb:没有我在清单中设置的任何IME选项。 而对于EDITTEXT这里是: <的EditText 机器人:ID = “@ + ID/et_search_category” 机器人:layout_width = “match_parent” 机器人:layout_height = “WRAP_CONTENT” 机器人:layout_toLeftOf =“@ + ID/imgClearSearch” 机器人:背景= “@绘制/ rounded_rdt_txt” 机器人:提示= “搜索这里......” 机器人:layout_centerVertical = “真” 机器人:单线= “真” /> –

+0

我不知道现在有时间运行并测试一些东西。如果它仍然在周二,我会写一个答案(我真的很忙atm) –

+0

无忧@YvetteColomb。感谢您宝贵的时间。 :) –

回答

4

最后,我想出了解决方案:

我看到默认的进度对话框延伸AlertDialog。但是,在我的代码中,我扩展了Dialog类。

现在我正在扩展ProgressDialog而不是Dialog,它的工作原理就像一个魅力。

下面是代码:

public class MyCustomProgressDialog extends ProgressDialog { 
private ImageView imageView; 

public MyCustomProgressDialog(Context context) { 
    super(context, R.style.TransparentProgressDialog); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    WindowManager.LayoutParams wlmp = getWindow().getAttributes(); 
    wlmp.gravity = Gravity.CENTER; 
    getWindow().setAttributes(wlmp); 
    setTitle(null); 
    setCancelable(false); 
    setOnCancelListener(null); 

} 

public MyCustomProgressDialog(Context context, int theme) { 
    super(context, theme); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.view_custom_progress_dialog); 

    imageView = (ImageView) findViewById(R.id.centerImage); 
    imageView.setBackgroundResource(R.drawable.custom_dialog); 

} 

@Override 
public void show() { 
    super.show(); 
    AnimationDrawable frameAnimation = (AnimationDrawable) imageView.getBackground(); 
    frameAnimation.start(); 
} 

@Override 
public void dismiss() { 
    super.dismiss(); 
} 
} 

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<ImageView 
    android:id="@+id/centerImage" 
    android:layout_width="80dp" 
    android:layout_height="80dp" 
    android:layout_centerInParent="true" 
    android:visibility="visible" /> 
</RelativeLayout> 

style.xml:

<style name="TransparentProgressDialog" parent="@android:style/Theme.Dialog"> 
    <item name="android:windowFrame">@null</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowIsFloating">true</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowTitleStyle">@null</item> 
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> 
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item> 
    <item name="android:backgroundDimEnabled">true</item> 
    <item name="android:background">@android:color/transparent</item> 
</style> 

如何调?:

ProgessDialog mProgressDialog = new MyCustomProgressDialog(this); 
mProgressDialog.show(); //to show 
mProgressDialog.dismiss(); //to dismiss 
1

1.know关于是否软键盘显示与否。

2.show或隐藏软键盘

试试这个。

private Context context; 
private boolean isShow = false; 

// soft keyboard is show or not 
private boolean isSoftShowing() { 
    // screen height 
    int screenHeight = getWindow().getDecorView().getHeight(); 
    Rect rect = new Rect(); 
    getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); 

    return screenHeight - rect.bottom - getSoftButtonsBarHeight() != 0; 
} 

private int getSoftButtonsBarHeight() { 
    DisplayMetrics metrics = new DisplayMetrics(); 
    // screen height ,not include navigation 
    ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    int usableHeight = metrics.heightPixels; 
    // real screen height 
    ((Activity) context).getWindowManager().getDefaultDisplay().getRealMetrics(metrics); 
    int realHeight = metrics.heightPixels; 
    if (realHeight > usableHeight) { 
     return realHeight - usableHeight; 
    } else { 
     return 0; 
    } 
} 

@Override 
public void show() { 
    super.show(); 
    // hideSoftKeyboard 
    if(isSoftShowing()){ 
     ((Activity)context).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
     isShow = true; 
    } 
    AnimationDrawable frameAnimation = (AnimationDrawable) imageView.getBackground(); 
    frameAnimation.start(); 
} 

@Override 
public void dismiss() { 
    super.dismiss(); 
    if(isShow){ 
     ((Activity)context).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
    } 
} 
+0

我编辑它,你可以检查它。@ RonakThakkar – KeLiuyue

+0

这将在每次解雇后打开键盘。在整个项目中:( –

+0

我希望它保持原样,如果它在进度对话框之前是可见的,那么它应该保持可见 如果它在显示进度对话框之前是不可见的,那么它应该保持不可见状态,即UnChanged例如 –