Android의 전체 화면 대화 상자
거의 전체 화면 DialogFragment를 표시하려고합니다. 그러나 나는 어떻게 든 그렇게 할 수 없습니다.
내가 조각을 보여주는 방식은 안드로이드 개발자 문서에서 나온 것입니다.
FragmentManager f = ((Activity)getContext()).getFragmentManager();
FragmentTransaction ft = f.beginTransaction();
Fragment prev = f.findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = new DetailsDialogFragment();
newFragment.show(ft, "dialog");
조각의 RelativeLayout을 fill_parent 및 minWidth 및 minHeight로 설정하려고 순진하게 시도했습니다.
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minWidth="1000px"
android:minHeight="600px"
android:background="#ff0000">
DialogFragment가 화면의 대부분을 채울 것으로 예상합니다. 그러나 세로로만 크기를 조정하지만 가로로 고정 너비가 될 때까지만 크기를 조정합니다.
또한 http://groups.google.com/group/android-developers/browse_thread/thread/f0bb813f643604ec에서 제안한 것처럼 코드에서 창 속성을 설정하려고했습니다 . 그러나 이것은 도움이되지 않았습니다.
나는 안드로이드가 Dialogs를 어떻게 처리하는지에 대해 오해하고있을 것입니다. 이런 식으로 어떻게 할 수 있습니까? 목표를 달성 할 수있는 다른 방법이 있습니까?
안드로이드 장치 :
Asus EeePad Transformer
Android 3.0.1
업데이트 : 이제 조각에 다음 코드를 사용하여 전체 화면으로 가져 왔습니다.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light);
}
불행히도, 이것은 내가 원하는 것이 아닙니다. 대화 상자 주변에 작은 "패딩"이 있어야 배경을 표시 할 수 있습니다.
그것을 달성하는 방법에 대한 아이디어가 있습니까?
LinearLayout
대신로 전환 해보십시오 RelativeLayout
. 테스트 할 때 3.0 Honeycomb API를 타겟팅하고있었습니다.
public class FragmentDialog extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.show);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDialog();
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
void showDialog() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
DialogFragment newFragment = MyDialogFragment.newInstance();
newFragment.show(ft, "dialog");
}
public static class MyDialogFragment extends DialogFragment {
static MyDialogFragment newInstance() {
MyDialogFragment f = new MyDialogFragment();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_dialog, container, false);
return v;
}
}
}
및 레이아웃 : fragment_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="1000dp"
android:minHeight="1000dp">
</LinearLayout>
main.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="match_parent"
android:background="#ffffff">
<Button android:id="@+id/show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:text="show">
</Button>
</LinearLayout>
전체 화면에서 DialogFragment를 가져 오려면
onStart
다음과 같이 DialogFragment를 재정의 하십시오.
@Override
public void onStart()
{
super.onStart();
Dialog dialog = getDialog();
if (dialog != null)
{
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
dialog.getWindow().setLayout(width, height);
}
}
그리고이 게시물에 대단히 감사드립니다 : 안드로이드의 신비-전체 화면-대화-조각
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL,
android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}
이 링크 DialogFragment 전체 화면에 측면에 패딩 이 표시되면 매력처럼 작동합니다.
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
// the content
final RelativeLayout root = new RelativeLayout(getActivity());
root.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
// creating the fullscreen dialog
final Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(root);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
return dialog;
}
스타일 만 사용하여 전체 화면 대화 상자 만들기
첫 번째 해결책
1. 다음에 추가하십시오 style.xml
.
<style name="FullScreenDialog" parent="Theme.AppCompat.Light.Dialog">
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:padding">0dp</item>
<item name="android:windowIsFloating">false</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
2. DialogFragment에 추가하십시오 :
@Override
public int getTheme() {
return R.style.FullScreenDialog;
}
대체 솔루션
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(DialogFragment.STYLE_NO_FRAME, R.style.AppTheme)
}
AppTheme
스타일로 정의한 테마는 어디에 있습니까 ?
제 경우에는 다음 접근법을 사용했습니다.
@Override
public void onStart() {
super.onStart();
getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
}
또한 모든 공간을 내용으로 채우는 LinearLayout.
그러나 대화 상자의 왼쪽과 오른쪽 가장자리와 일부 Lollipop + 장치 (예 : Nexus 9)의 화면 가장자리 사이 에는 여전히 작은 간격 이있었습니다 .
분명하지는 않았지만 마침내 모든 장치와 플랫폼에서 전체 너비 로 만들려면 창 배경 이 다음과 같이 styles.xml 안에 지정되어야한다는 것을 알았습니다 .
<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:padding">0dp</item>
<item name="android:windowBackground">@color/window_bg</item>
</style>
물론이 스타일은 다음과 같은 대화 상자를 만들 때 사용해야합니다.
public static DialogFragment createNoTitleDlg() {
DialogFragment frag = new Some_Dialog_Frag();
frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
return frag;
}
전체 화면 대화 상자를 사용할 때 문제가 발생했습니다 .Fragment : 전체 화면을 설정하는 동안 항상 패딩이 있습니다. dialogFragment의 onActivityCreated () 메소드 에서이 코드를 사용해보십시오.
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
Window window = getDialog().getWindow();
LayoutParams attributes = window.getAttributes();
//must setBackgroundDrawable(TRANSPARENT) in onActivityCreated()
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
if (needFullScreen)
{
window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
}
Android API가 업데이트되는 한 전체 화면 대화 상자를 표시하기 위해 제안 된 방법은 다음과 같습니다.
FragmentTransaction transaction = this.mFragmentManager.beginTransaction();
// For a little polish, specify a transition animation
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
transaction.add(android.R.id.content, this.mFragmentToShow).commit();
그렇지 않으면 전체 화면으로 표시하지 않으려면 다음과 같이하십시오.
this.mFragmentToShow.show(this.mFragmentManager, LOGTAG);
도움이 되길 바랍니다.
편집하다
내가 준 솔루션은 효과가 있지만 때로는 문제가 될 수있는 약점을 가지고 있습니다. android.R.id.content
컨테이너에 DialogFragment를 추가하면 DialogFragment#setCancelable()
기능을 올바르게 처리 할 수 없으며 DialogFragment 자체를 백 스택에 추가 할 때 예기치 않은 동작이 발생할 수 있습니다.
따라서 다음과 같이 onCreate 메소드에서 DialogFragment의 스타일을 간단하게 변경하는 것이 좋습니다.
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Translucent_NoTitleBar);
}
도움이 되길 바랍니다.
onCreate에서 setStyle ()을 사용하고 제목없이 onCreateDialog make 대화 상자를 재정의하십시오.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
또는 onCreate ()를 재정의하고 코드를 설정하는 스타일을 설정하십시오.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme);
}
실제로 레이아웃 정의 방법에 따라 달라질 수 있습니다. 그러나 대화 상자가 필요한 크기를 갖도록하려면 가장 좋은 해결책은 대화 상자가 표시되면 (생성되지 않은 경우) LayoutParams를 제공하는 것입니다. DialogFragment에서 대화 상자는 onStart 메소드에 표시되므로 전체 너비를 얻는 유효한 메소드는 다음과 같습니다.
@Override public void onStart() {
super.onStart();
Dialog d = getDialog();
if (d!=null){
d.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}
}
NO_TITLE 스타일과 같은 테마 또는 스타일을 제공하려면 onCreate 메소드 를 사용하는 것이 가장 좋습니다 .
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog);
}
이것이 내가이 문제를 알아 낸 방법입니다.
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
@Override
public void onStart() {
super.onStart();
Dialog dialog = getDialog();
if (dialog != null) {
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
}
'_Fullscreen'추가를 제외하고 Chirag Nagariya가 옳습니다. Dialog 스타일에서 파생되지 않은 기본 스타일을 사용하여 해결할 수 있습니다. 'android.R.style.Theme_Black_NoTitleBar'도 사용할 수 있습니다.
style.xml에서 아래 테마를 작성하십시오.
<style name="DialogTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:paddingRight">0dp</item>
<item name="android:paddingLeft">0dp</item>
<item name="android:layout_width">match_parent</item>
<item name="android:windowNoTitle">true</item>
</style>
그런 다음 DialogFragment에서 스타일을 설정하십시오.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogTheme);
}
참고 : 여기에서도 정답을 찾을 수 있습니다. 그러나 나는 혼란을 분명히하고 싶다.
아래 코드를 사용하십시오. android.app.DialogFragment
@Override
public void onStart()
{
super.onStart();
Dialog dialog = getDialog();
if (dialog != null)
{
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
dialog.getWindow().setLayout(width, height);
}
}
아래 코드를 사용하십시오. android.support.v4.app.DialogFragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}
다른 사람 이이 문제를 겪을 경우 비슷한 경험이 있었지만 문제는 onCreateView에서 팽창 된보기를 반환하는 것을 잊어 버린 것입니다 (기본 super.onCreateView를 반환하는 대신). 나는 단순히 정확한 팽창 된보기를 반환하고 문제를 해결했습니다.
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new Dialog(getActivity(), android.R.style.Theme_Holo_Light);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
이 솔루션은 대화 상자에 전체 화면 테마를 적용하며 이는 onCreate의 Chirag setStyle과 유사합니다. 단점은 savedInstanceState가 사용되지 않는다는 것입니다.
여러 용도로 사용되는 일반적인 조각 대화 상자에서이 기능을 사용해보십시오. 희망이 당신이 내기를 도울 것입니다
public class DialogFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_visit_history_main, container, false);
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
initializeUI(rootView);
return rootView;
}
@Override
public void onStart() {
super.onStart();
Dialog dialog = getDialog();
if (dialog != null) {
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
dialog.getWindow().setLayout(width, height);
}
}
private void initializeUI(View rootView) {
//getChildFragmentManager().beginTransaction().replace(R.id.fv_container,FragmentVisitHistory.getInstance(), AppConstant.FRAGMENT_VISIT_HISTORY).commit();
}
}
이것은 조각화로 설정 해야하는 것입니다.
/* theme is optional, I am using leanback... */
setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);
귀하의 경우 :
DialogFragment newFragment = new DetailsDialogFragment();
newFragment.setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);
newFragment.show(ft, "dialog");
그리고 왜? DialogFragment (명시 적으로 말하지 않은 경우)는 내부 스타일을 사용하여 사용자 정의 레이아웃을 래핑합니다 (전체 화면 등 없음).
그리고 레이아웃? 해키 방법이 필요하지 않습니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</RelativeLayout>
즐겨
나는 여전히이 질문에 대답하기에 늦었습니다. 나중에 누구나이 질문을 사용할 수 있도록이 답변을 공유하고 싶습니다.
내 프로젝트 에서이 코드를 사용했으며 더 높은 버전뿐만 아니라 더 낮은 버전에서도 작동합니다.
다음과 같이 onCreateDialog () 내 에서이 테마를 사용하십시오.
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_pump_details, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_Black_NoTitleBar_Fullscreen);
return builder.create();
}
android.R.style.Theme_Black_NoTitleBar_Fullscreen-이 테마의 소스 코드는이 테마만으로도 DialogFragment를 전체 화면으로 표시하기에 충분하다는 것을 알 수 있습니다.
<!-- Variant of {@link #Theme_Black} that has no title bar and
no status bar. This theme
sets {@link android.R.attr#windowFullscreen} to true. -->
<style name="Theme.Black.NoTitleBar.Fullscreen">
<item name="windowFullscreen">true</item>
<item name="windowContentOverlay">@null</item>
</style>
누구든지 문제가 발생하면 알려주십시오. 이것이 도움이 되길 바랍니다. 감사 :)
상대 레이아웃에서 작업하는 경우에도 다음과 같은 방식으로 작동합니다. 다음 단계를 수행하십시오.
- 테마 편집기로 이동하십시오 (도구-> Android-> 테마 편집기에서 사용 가능).
- 모든 테마 표시를 선택하십시오. AppCompat.Dialog가 있는 것을 선택하십시오.
- 특정 색상의 배경 또는 투명 배경이되도록하려면 Android 창 배경 옵션을 선택하십시오.
- 색상을 선택하고 확인을 누르십시오. 새로운 테마의 이름을 선택하십시오.
styles.xml로 이동 한 다음 방금 추가 한 테마에서 다음 두 속성을 추가하십시오.
<item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">false</item>
대화 상자의 내 테마 설정은 다음과 같습니다.
<style name="DialogTheme" parent="Theme.AppCompat.Dialog" >
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">false</item>
테마에 Theme.AppCompat.Dialog 와 같은 부모가 있는지 확인하십시오. 또 다른 방법은 styles.xml에서 새 스타일을 만들고 위 코드에 따라 변경하는 것입니다.
Dialog Fragment 클래스로 이동하여 onCreate () 메소드에서 Dialog 스타일을 다음과 같이 설정하십시오.
@Override public void onCreate (@Nullable Bundle savedInstanceState) {super.onCreate (savedInstanceState); setStyle (DialogFragment.STYLE_NORMAL, R.style.DialogTheme); }
그리고 kotlin 버전!
override fun onStart() {
super.onStart()
dialog?.let {
val width = ViewGroup.LayoutParams.MATCH_PARENT
val height = ViewGroup.LayoutParams.MATCH_PARENT
it.window?.setLayout(width, height)
}
}
window.setLayout
구형 장치로는 충분하지 않습니다.
여기 내가하는 일이 있습니다.
try {
ViewGroup parent = (ViewGroup) view;
do {
parent = (ViewGroup) parent.getParent();
if (parent == null)
break;
parent.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
parent.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
parent.requestLayout();
} while (true);
} catch (Exception e){}
This below answer works for me in fragment dialog.
Dialog dialog = getDialog();
if (dialog != null)
{
int width = ViewGroup.LayoutParams.MATCH_PARENT;
int height = ViewGroup.LayoutParams.MATCH_PARENT;
dialog.getWindow().setLayout(width, height);
}
전체 화면 대화 상자 스타일로 아래 행을 추가하십시오.
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsFloating">false</item>
새로운 기능을 사용하는 솔루션 ConstraintLayout
은 ConstraintLayout
in LinearLayout
을 minHeight 및 minWidth로 고정 하여 감싸는 것 입니다 . 줄 바꿈이 없으면 ConstraintLayout이 대화 상자에 적합한 크기를 얻지 못합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="1000dp"
android:minHeight="1000dp"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background_color"
android:orientation="vertical">
<!-- some constrained views -->
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
참고 URL : https://stackoverflow.com/questions/7189948/full-screen-dialogfragment-in-android
'IT' 카테고리의 다른 글
파이썬에서 클래스를 어떻게 디자인합니까? (0) | 2020.06.19 |
---|---|
“ViewController라는 클래스에 대한 정보를 찾을 수 없습니다” (0) | 2020.06.19 |
PHP 앱이 404 오류를 보내지 않는 이유는 무엇입니까? (0) | 2020.06.19 |
Objective-C에서 -init 메소드를 개인용으로 만들 수 있습니까? (0) | 2020.06.19 |
UIView 주위의 점선 경계선 (0) | 2020.06.19 |