대화 상자로서의 안드로이드 활동


답변:


546

대화 상자로 활동을 시작하려면 다음과 같이 정의했습니다 AndroidManifest.xml.

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

activity대화 상자가 최근에 사용 된 앱 목록에 나타나지 않도록 태그 안에이 속성을 사용하십시오.

android:excludeFromRecents="true"

사용자가 대화 상자 외부를 클릭 할 때 대화 상자 / 활동이 손상되지 않도록하려면 다음을 수행하십시오.

setContentView()귀하의 Activity사용 :

this.setFinishOnTouchOutside(false);

이제 전화 startActivity()하면 대화 상자로 표시되며 사용자가 뒤로 버튼을 누르면 이전 활동이 표시됩니다.

당신이 사용하는 경우 있습니다 ActionBarActivity(또는 APPCOMPAT 테마), 당신은 사용해야합니다 @style/Theme.AppCompat.Dialog대신.


186
android : theme = "@ android : style / Theme.Dialog"를 사용하는 방법이 있지만, excludeFromRecents = true를 사용하는 것을 잊지 마십시오. 그렇지 않으면 대화 상자가 최근에 사용한 앱에 표시됩니다 (홈 키 유지).
Emmanuel

7
대화 상자로 활동과 관련된 어려움이 있습니다. 대화로 활동을 만들었지 만 문제는 활동 외부를 클릭하면 자동으로 닫힙니다 .. ??? 이것과 관련된 해결책이 있습니까?. ??????
울버린

7
@ Emmanuel, 그것은 android : excludeFromRecents = "true"여야합니다. 큰 따옴표에 주목하십시오
Sandeep

43
ActionBarActivity (또는 AppCompat 테마)를 사용하는 경우 다음을 사용해야합니다.@style/Theme.AppCompat.Dialog
Quentin Klein

8
@Wolverine, 사용자가 만든 대화 상자 외부를 클릭 할 때 활동이 손상되지 않도록 this.setFinishOnTouchOutside(false);after after setContentView()method
Anggrayudi H

43

사용자가 대화 상자 외부를 터치 할 때 대화 상자 활동이 닫히지 않도록이 코드를 사용하십시오.

this.setFinishOnTouchOutside(false);

API 레벨 11이 필요합니다


1
API <11에 대한 솔루션이 있습니까?
PK Gupta

@pkgupta, 당신이 받아 들일 수 있다면 어쨌든 이전 버전을 사용하는 사람들이 많지 않기 때문에 적어도 API <15를 걱정해서는 안됩니다. 실제로 2017 년 현재 19 또는 20이 새로운 minSDK라고 생각합니다.
Neon Warge

28

보다 오래된 스플래시를 수행하기 위해 values ​​/ styles.xml에서이 스타일을 정의 할 수 있습니다.

   <style name="Theme.UserDialog" parent="android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@drawable/trans</item>
    </style>

그리고 AndroidManifest.xml을 사용하십시오.

   <activity android:name=".SplashActivity"
          android:configChanges="orientation"
          android:screenOrientation="sensor"
          android:theme="@style/Theme.UserDialog">

2
@drawable/trans: 당신이 사용할 수 있어야 @android:color/transparent을 만들 것이다 ColorDrawable배경으로 사용할 수 있습니다.
TWiStErRob 12

1
<item name = "android : windowBackground"> ​​@ null </ item>은 또 다른 대안입니다
TouchBoarder

문제는 활동이 전체 화면을 채우고 있지만 대화 상자 오버레이로 표시되지 않는다는 것입니다.
Shajeel Afzal

그것은이다 <item name="windowNoTitle">true</item> (더는 "안드로이드 없다"). 여기를 참조 하십시오 . 다른 품목에 대해서는 확실하지 않습니다.
Gary99

23

1-대화 상자 및 전체 화면과 동일한 활동을 동적으로 사용할 수 있습니다.

전화 setTheme(android.R.style.Theme_Dialog)호출하기 전에 setContentView(...)super.oncreate()당신의 활동에.

2-활동 테마 스타일을 변경하지 않으려는 경우 사용할 수 있습니다.

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

(@faisal khan에서 언급했듯이)


참고 사항 : 프로그래밍 방식 (첫 번째 방법)을 사용하면 대화 상자 뒤에있는 모든 것이 완전히 검게 표시됩니다. 그러나 다른 방법에서는 문제가되지 않았습니다. 너무 나쁘다 ... 정말 프로그래밍 방식으로하고 싶었다 ... Nexus 5, Android 6.0.1
Eric

@ 에릭은 블랙 아웃에 대한 해결책을 찾았습니까?
anand

1
@anand 그렇습니다. 두 솔루션을 함께 결합하면 블랙 아웃 문제가 해결됩니다. android manifest ( <activity android:theme="@android:style/Theme.Dialog" />) 에서 활동 테마를 대화 상자 테마로 설정하고 onCreate stackoverflow.com/a/35915764/2898715
Eric

21

Appcompat 버전이 필요한 경우

style.xml

    <!-- Base application theme. -->
    <style name="AppDialogTheme" parent="Theme.AppCompat.Light.Dialog">
        <!-- Customize your theme here. -->
        <item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
    </style>

yourmanifest.xml

    <activity
          android:name=".MyActivity"
          android:label="@string/title"
          android:theme="@style/AppDialogTheme">
    </activity>

대단하다. 작업 표시 줄을 제거해야했습니다. 그래도 XML을 약간 수정해야했습니다. 나는 <item name="windowNoTitle">true</item>그것이 나를 위해 작동 하도록 추가 해야했습니다. 나는 또한 <item name="android:windowActionBar">false</item>좋은 측정을 위해 추가 했다.
Eric

5
또한 나를 <item name="android:windowNoTitle">true</item>위해 (Android 5.0.1) 작동하지 않아서<item name="windowNoTitle">true</item>
를 NotI

17

액티비티가 대화 상자로 렌더링되는 경우 액티비티 XML에 버튼을 추가하기 만하면됩니다.

<Button
    android:id="@+id/close_button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Dismiss" />

그런 다음 활동의 Java 코드에 클릭 리스너를 첨부하십시오. 리스너에서 간단히 전화finish()

Button close_button = (Button) findViewById(R.id.close_button);
close_button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});

대화가 사라지고 통화 활동으로 돌아갑니다.


8

활동 헤더를 제거하고 대화 상자에 대한 사용자 정의보기를 제공하려면 매니페스트의 활동 블록에 다음을 추가하십시오.

android:theme="@style/Base.Theme.AppCompat.Dialog"

원하는 뷰로 activity_layout을 디자인하십시오.


2

안드로이드 매니페스트 파일에서 테마를 설정하십시오.

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

터치시 대화 상자 상태를 설정하여 완료합니다.

this.setFinishOnTouchOutside(false);

1

대화 상자로 활동을 작성하십시오. 전체 예는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

  1. AndroidManife.xml

    <activity android:name=".appview.settings.view.DialogActivity" android:excludeFromRecents="true" android:theme="@style/Theme.AppCompat.Dialog"/>

  2. DialogActivity.kt

    class DialogActivity : AppCompatActivity() {
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_dialog)
        this.setFinishOnTouchOutside(true)
    
        btnOk.setOnClickListener {
          finish()
        }
      }
    }
  3. activity_dialog.xml

    <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="wrap_content"
    android:background="#0072ff"
    android:gravity="center"
    android:orientation="vertical">
    
    <LinearLayout
        android:layout_width="@dimen/_300sdp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/txtTitle"
            style="@style/normal16Style"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingTop="20dp"
            android:paddingBottom="20dp"
            android:text="Download"
            android:textColorHint="#FFF" />
    
        <View
            android:id="@+id/viewDivider"
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="#fff"
            android:backgroundTint="@color/white_90"
            app:layout_constraintBottom_toBottomOf="@id/txtTitle" />
    
        <TextView
            style="@style/normal14Style"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingTop="20dp"
            android:paddingBottom="20dp"
            android:text="Your file is download"
            android:textColorHint="#FFF" />
    
    
        <Button
            android:id="@+id/btnOk"
            style="@style/normal12Style"
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:layout_marginBottom="20dp"
            android:background="@drawable/circle_corner_layout"
            android:text="Ok"
            android:textAllCaps="false" />
        </LinearLayout>
    
      </LinearLayout>

답이 이상하게 보일 때 큰 글꼴을 사용하지 마십시오.
CopsOnRoad

0

때때로 당신은 아래에 주어진 예외를 얻을 수 있습니다

원인 : java.lang.IllegalStateException :이 활동과 함께 Theme.AppCompat 테마 (또는 하위 항목)를 사용해야합니다.

따라서 해결을 위해 간단한 솔루션을 사용할 수 있습니다

appCompact의 대화 상자로 매니페스트에 활동 테마를 추가하십시오.

android:theme="@style/Theme.AppCompat.Dialog"

누군가에게 도움이 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.