나는'm 를 사용하려고 시도SherlockDialogFragment
하는 물에서 입력 사용자. 모든 것을 전(갤럭시 넥서스,4.2),그러나 더 작은 휴대 전화(에뮬레이터 2.3.3),경우 키보드 보여줍니다,그것을 커버의 두 개의 버튼 DialogFragment 은 다음과 같습니다.
나의 레이아웃 안에 스크롤,그리고 나는'm 을 변경하 softInputMode 을SOFT_INPUT_ADJUST_RESIZE
나onViewCreated
. 도SOFT_INPUT_ADJUST_PAN
,그리고 그't work
MyCustomDialog.java
public class AddTaskDialog extends SherlockDialogFragment implements OnDateSetListener{
//...
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
this.inflater = getActivity().getLayoutInflater();
View mainView =inflater.inflate(R.layout.custom_dialog, null);
builder.setView(mainView);
this.taskNote = (EditText) mainView.findViewById(R.id.ET_taskNote);
this.taskText = (EditText) mainView.findViewById(R.id.ET_taskText);
this.taskValue = (EditText) mainView.findViewById(R.id.ET_taskValue);
/*
* Other stuff
*/
builder.setTitle(getString(R.string.new_task, hType.toString()))
.setPositiveButton(R.string.dialog_confirm_button, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//...
}
})
.setNegativeButton(R.string.dialog_cancel_button, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
return builder.create();
}
}
그리고 여기 나의 레이아웃:
custom_dialog.xml
<?xml version="1.0"encoding="utf-8"?> <스크롤 xmlns:안드로이드="http://schemas.android.com/apk/res/android" 안드로이드:layout_width="match_parent" 안드로이드:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/abs__background_holo_light">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/TV_taskText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/task_text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/ET_taskText"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:hint="@string/create_task_hint"
android:inputType="textNoSuggestions"
android:singleLine="true" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_vertical_margin" >
<TextView
android:id="@+id/TV_taskNote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/task_note"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/ET_taskNote"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:minLines="2"
android:layout_weight="1"
android:ems="10"
android:inputType="textMultiLine"
android:hint="@string/task_note_hint">
</EditText>
</LinearLayout>
<LinearLayout
android:id="@+id/repeat_days"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="top"
android:orientation="horizontal"
android:visibility="gone"
android:paddingLeft="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_vertical_margin">
<!-- Day buttons are put here programatically -->
</LinearLayout>
</LinearLayout>
</스크롤>
그래서,당신은 나에게 도움이 될 수,그리고 나를 안내하는 방법에 대하여 그의 버튼? 을 보거나 그것의 크기를 조정...
나는 단지를 사용하여 다음 줄에서 내 DialogFragment:
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
과 아무것도 여기를 참조하십시오 전체 예제:
public class TextEditor extends DialogFragment {
public TextEditor () {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_text_editor, container);
//set to adjust screen height automatically, when soft keyboard appears on screen
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
//[add more custom code...]
return view;
}
}
설정windowSoftInputMode
속성을adjustNothing 에서``AndroidManifest.xml
의 활동을 사용하는 대화 조각입니다.
<activity
...
android:windowSoftInputMode="adjustNothing">
...
그리고onCreateDialog
을 숨기려면 소프트 입력:
...
Dialog dialog = builder.create();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
return dialog;
}
참고:https://developer.android.com/training/keyboard-input/visibility.html#ShowOnStart
비록 그것이 조금 늦에 대한 답변,때문에 이 질문은 DialogFragment,다음과 같은 코드를 해결이 내 문제입니다.
@Override
public void onCreate(Bundle savedInstanceState) {
...
// Setting STYLE_NO_FRAME allows popup dialog fragment to resize after keyboard is shown
setStyle(DialogFragment.STYLE_NO_FRAME, R.style.theme_popupdialog_style);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setCanceledOnTouchOutside(false);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
return dialog;
}
한 스타일의 테마,내가 적용되는 다음 코드
/** must put parent="@android:style/Theme.Dialog for it to work */
<style name="theme_popupdialog_style" parent="@android:style/Theme.Dialog">
<item .... >...</item>
</style>
해야 하는 레이아웃 안에 스크롤 view:
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
-->your layout here
</ScrollView>
따라더크 코멘트:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_text_editor, container);
//add this line
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
//[add more custom code...]
return view;
}
이 솔루션습니다.
내부 스타일
<style name="BottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog">
<item name="bottomSheetStyle">@style/AppModalStyle</item>
<item name="android:windowIsFloating">false</item>
<item name="android:windowSoftInputMode">adjustResize</item>
</style>
<style name="AppModalStyle" parent="Widget.Design.BottomSheet.Modal">
<item name="android:background">@drawable/rounded_corner_dialog</item>
</style>
여기에서안드로이드:windowIsFloating
false 가 됩&안드로이드:windowSoftInputMode
해야adjustResize
.
포장 내부의 레이아웃 NestedScrollView
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<--Rest of the layout-->
</androidx.core.widget.NestedScrollView>
이미 언급했듯이,안드로이드:windowSoftInputMode="adjustResize"
와대화.getWindow().setSoftInputMode(WIndowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
는 올바른 방법이 있습니다.
지만....... 의 경우 보이지 않는 크기 조정 가능한 모두에서,다음의 버튼 바닥에 있는 것입니다 여전히 숨겨져 있습니다. 제 경우에는이 해킹에 충분했:
나는안드로이드:layout_weight
최고의 전망을 때에 키보드가 열리고 대화의 크기를 조정—top 보기 숨기:
에 대한 DialogFragment,그것은 보인다는 적용 SoftInputMode 경우에만 작동에 살고 있고 내부에서 DialogFragment 클래스행되는 클래스:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
또한,에 대한 종료 방법을 추가했음을 확장 레이아웃을 대화 수평:
@Override
public void onStart() {
super.onStart();
getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}