화면을 채우는 대화 상자 스타일 활동 창을 얻으려면 어떻게해야합니까?


142

대화 상자 테마 세트가있는 활동을 사용하고 있으며 전체 화면으로 만들고 싶습니다. WindowManager를 통해 창을 전체 너비와 높이로 수동으로 확장하더라도 모든 종류의 작업을 시도했지만 아무것도 작동하지 않습니다.

분명히 대화 상자 창 (또는 대화 상자 테마가있는 활동)은 내용에 따라 확장되지만 항상 작동하지는 않습니다. 예를 들어, 너비와 높이가 FILL_PARENT (레이아웃 컨테이너도)로 설정된 진행률 표시 줄 원을 표시하지만 여전히 대화 상자는 화면을 채우지 않고 훨씬 작은 진행률 표시 줄을 둘러 쌉니다.

대화 상자 창 안에 작은 것을 표시하는 방법이 있어야하지만 내용 크기를 조정하지 않고 전체 화면 크기로 확장해야합니까?


2
재미있는 참고 : 레이아웃 컨테이너의 너비와 높이를 실제 값 (픽셀)로 설정하면 대화 상자의 크기가 적절하게 조정됩니다. 그러나 FILL_PARENT로 설정하면 그렇지 않습니다.
Matthias

정말? 활동이 인스턴스화하는 레이아웃입니다. fill_parent의 높이와 너비로 설정된 상위 Relative 또는 LinearLayout 태그가 있습니까? 대화 상자 테마로 몇 가지 활동을 구현했으며 전체 화면을 차지하는 데 아무런 문제가 없었습니다.
MattC

예, 활동의 너비와 높이 모두에 대해 LinearLayout이 FILL_PARENT로 설정되어 있습니다.
Matthias

해결 방법을 사용하여 문제를 해결했지만 좋은 해결책이 아니므로 질문을 열어 두겠습니다. 내가 한 것은 LinearLayout을 서브 클래스 화하고 레이아웃 사이클 중 뷰의 크기를 결정하는 onMeasure () 메서드를 재정의하고 화면 너비와 높이로 수정하는 것입니다. 메뉴 막대가 차지하는 공간을 고려하지 않기 때문에 이것은 정확하지 않습니다. 따라서 컨테이너는 실제로 화면에 보이는 것보다 키가 큽니다. 화면).
Matthias

올바른 해결책을 찾았습니다. 아래 답변을 참조하십시오.
Matthias

답변:


312

해결책을 찾았습니다.

Theme.Dialog스타일 세트 가있는 활동 에서 다음을 수행하십시오.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

에 전화 Window.setLayout() 한 후 전화 를 거는 것이 중요합니다 setContentView(). 그렇지 않으면 작동하지 않습니다.


5
고마워, 내 시간을 절약, 아무데도 알아낼 수 없었습니다! 그러나 왜 우리가 코드에서 명시 적으로 지정 해야하는지, 왜 테마 대화 상자가있는 활동에 대해 fill_parent가 xml을 통해 작동하지 않습니까?
앉아

3
이 대화 상자는 XML이 아니라 너비를 채우지 않습니다. 손톱을 먹어요.
eitama

6
그리고는 다음과 같습니다import android.view.ViewGroup.LayoutParams;

11
FILL_PARENT는 더 이상 사용되지 않습니다. 대신 MATCH_PARENT를 사용하십시오.
AlexV

4
전체 화면을 채우지 않고 양쪽에 작은 패딩이있는 것처럼 보입니다.
Machado

66

이 값을 스타일 android : windowMinWidthMajor 및 android : windowMinWidthMinor에 추가 할 수 있습니다.

<style name="Theme_Dialog" parent="android:Theme.Holo.Dialog">
    ...
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
</style>

2
가장 쉬운 솔루션. 또한 appcompat 지원 라이브러리와 함께 작동합니다. 감사.
Muhammad Saqib

이 답변을 수락해야합니다. 가장 적절하고 깨끗한 방법입니다. "스타일 / Theme.AppCompat.Light.Dialog @"= 부모를 사용하는 것을 고려
키릴 Karmazin에에게

이것은 작동하는 것처럼 보이지만 나에게는 적합하지 않습니다. 흠, 왜 그런지 궁금하다. 아마도 상황은 2014 년 이후로 변했을 것입니다.
Scott Biggs

53

아래 화면과 같이 80 % 만 채우고 싶습니다.

        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int screenWidth = (int) (metrics.widthPixels * 0.80);

        setContentView(R.layout.mylayout);

        getWindow().setLayout(screenWidth, LayoutParams.WRAP_CONTENT); //set below the setContentview

getContentow (..) 아래에 getwindow (). setLayout ... 줄을 넣을 때만 작동합니다.

감사합니다 @ Matthias


11

dialog_custom_layout.xml 을 다른 레이아웃 대신 RelativeLayout 으로 래핑하십시오 .


1
여기서도 너비와 높이가 완전히 잘못되어 수정 방법을 알 수 없었습니다. 루트 레이아웃을 RelativeLayout으로 변환하면 문제가 해결되었습니다!
SharpMobileCode

8

대화의 경우 누군가에게 도움이 될 수 있습니다. 대화 상자가 전체 화면 너비를 갖기를 원합니다. 많이 검색했지만 유용한 것은 없습니다. 마침내 이것은 나를 위해 일했습니다 :

mDialog.setContentView(R.layout.my_custom_dialog);
mDialog.getWindow().setBackgroundDrawable(null);

이것을 추가하면 대화 상자가 전체 화면으로 나타납니다.


5

이 답변은 "Theme.AppCompat.Dialog"또는 "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayNight.Dialog"등과 같은 다른 "Theme.AppCompat.Dialog"자손을 사용하는 사람들을위한 해결책 입니다 . 모든 활동에 대해 AppCompatActivity를 사용하므로 AppCompat 대화 상자를 사용해야합니다. 허용 된 답변을 사용하면 대화 상자의 모든면 (상단, 오른쪽, 하단 및 왼쪽)에 패딩이 생기는 문제가 있습니다.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

활동 스타일에 다음 코드를 추가하십시오.

<style name="DialogActivityTheme" parent="Theme.AppCompat.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@null</item>
</style>

알다시피, 대화 상자에 패딩을 생성하는 문제는 "android : windowBackground"이므로 창 배경을 null로 만듭니다.


2

최상위 레이아웃에서 최소 너비를 설정하십시오.

android:minWidth="300dp"

예를 들면 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="300dp">

<!-- Put remaining contents here -->

</LinearLayout>

2

Matthias의 대답은 대부분 옳지 만 양쪽에 작은 패딩이 있기 때문에 여전히 전체 화면을 채우지 않습니다 (@Holmes가 지적). 그의 코드 외에도 Theme.Dialog 스타일을 확장하여 이와 같은 속성을 추가하여이 문제를 해결할 수 있습니다.

<style name="MyDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
</style>

그런 다음 테마를 다음과 MyDialog같이 설정하여 Activity를 선언합니다 .

<activity
    android:name=".FooActivity"
    android:theme="@style/MyDialog" />

1

이것은 나 같은 사람에게 도움이 될 것입니다. 사용자 정의 대화 상자 스타일을 작성하십시오.

<style name="MyDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsFloating">false</item>
</style>

에서 AndroidManifest.xml원하는 활동에 대한 파일 집합 테마 :

<activity
        android:name=".CustomDialog"
        ...
        android:theme="@style/MyDialog"/>

그게 다야, 프로그래밍 방식으로 메소드를 호출 할 필요가 없습니다.


여전히 양쪽에 패딩을 표시하고 (상단, 오른쪽, 하단 및 왼쪽) 상태 표시 줄도 표시해야하는 경우이 솔루션은 실패합니다
HendraWD

확인 stackoverflow.com/a/39590004/3940133를 각 측면에 패딩이있는 경우
HendraWD

0

활동이 정의 된 매니페스트 파일에서

<activity
        android:name=".YourPopUpActivity"
        android:theme="@android:style/Theme.Holo.Dialog" >
    </activity>

액션 바없이

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.