Android Dialog: Titelleiste entfernen


108

Ich habe ein seltsames Verhalten, dessen Quelle ich nicht genau bestimmen kann.

Ich habe meine App mit dem Klassiker

requestWindowFeature(Window.FEATURE_NO_TITLE);

um die Titel- / Statusleiste zu entfernen.

Ich erstelle dann ein Dialogfeld, in dem der Benutzer Informationen (Name usw.) eingeben kann.

Mit einer physischen Tastatur kein Problem, aber wenn ich die virtuelle Tastatur verwende, habe ich ein seltsames Verhalten:

Jedes Mal, wenn ich eine Taste auf der virtuellen Tastatur drücke, wird die Titel- / Statusleiste erneut angezeigt, wobei das gesamte Tastaturlayout verschoben wird, und verschwindet dann wieder (genau wie die Animation beim Starten der Anwendung).

Hier ist ein Code:

        dialog = new Dialog(context);
        dialog.setContentView(R.layout.logindialog);
        dialog.setTitle("Login:");

        WindowManager.LayoutParams a = dialog.getWindow().getAttributes();

//      dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

        a.dimAmount = 0;
        dialog.getWindow().setAttributes(a);

        dialog.setCancelable(true);
        dialog.getWindow().setLayout(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);

und dann

dialog.show();

Ich habe es versucht

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

aber es stürzt meine App ab.

Hier ist die XML

    <TextView android:id="@+id/LoginText"
        android:gravity="fill"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Login:">
    </TextView>         
    <EditText android:id="@+id/LoginEdit"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text="jason"
        android:layout_width="200sp"/>
    <TextView android:id="@+id/PasswordText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Password:">
    </TextView>         
    <EditText android:id="@+id/PasswordEdit"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text="welcome"
        android:layout_width="200sp"
        android:password="true"/>
<LinearLayout 
    android:id="@+id/test2"
    android:gravity="center_horizontal"
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
<Button android:id="@+id/LoginButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:text="Login" />
<Button android:id="@+id/CreateButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:text="Create" />
<Button android:id="@+id/CancelLogin"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:text="Cancel" />
</LinearLayout>/>


Veröffentlichen Sie Ihren Logcat, wenn Sie dialog.requestWindowFeature (Window.FEATURE_NO_TITLE) verwenden. Verwenden Sie auch bei Verwendung der obigen Codezeile nicht dialog.setTitle ("Login:").
Ingsaurabh

Danke für den Vorschlag, aber es ist nicht das Problem. Wenn ich etwas mit der Tastatur tippe, wird die Statusleiste bei jedem Tastendruck angezeigt und ausgeblendet.
Jason Rogers

Antworten:


434

verwenden,

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); //before     
dialog.setContentView(R.layout.logindialog);

Danke für den Vorschlag, aber es ist nicht das Problem. Wenn ich etwas mit der Tastatur tippe, wird die Statusleiste bei jedem Tastendruck angezeigt und ausgeblendet.
Jason Rogers

9
Auf einigen Geräten verliert das Dialogfeldlayout dadurch seine Breite, behält jedoch seine Höhe bei. Ich fand, dass das Hinzufügen vor .show () das Problem behoben hat, obwohl sie bereits im XML-Layout festgelegt waren. dialog.getWindow (). setLayout (WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
a54studio

1
Im Fall von DialogFragment des inheritor brauchen wir setzen getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);innen onCreateView.
Anton Holovin

1
Wenn Sie AppCompatDialog verwenden, verwenden Sie: dialog.supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
Firzen

24

Erstellen Sie einen neuen Stil in styles.xml

<style name="myDialog" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

Fügen Sie dies dann Ihrem Manifest hinzu:

 <activity android:name=".youractivity" android:theme="@style/myDialog"></activity>

14

Alle oben genannten Antworten funktionieren bei AppCompatDialog nicht

Wenn Sie AppCompatDialog verwenden, versuchen Sie dies

Wichtiger Hinweis: Legen Sie dies fest, bevor Sie setContentView aufrufen.

dialog.supportRequestWindowFeature (Window.FEATURE_NO_TITLE);


Danke, das war mein Problem, das mich verrückt gemacht hat.
Gregko

5

Erstellen Sie Ihr XML, das hier im Dialogfeld angezeigt wird. Es ist activity_no_title_dialog

final Dialog dialog1 = new Dialog(context);
dialog1.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog1.setContentView(R.layout.activity_no_title_dialog);
dialog1.show();

2

Sie können das Thema auch in der Android-Manifestdatei definieren, damit die Titelleiste nicht angezeigt wird.

Sie definieren nur ein Thema android:theme="@android:style/Theme.Light.NoTitleBar"in einer Aktivität, in der die Titelleiste nicht angezeigt werden soll

Beispiel:-

    <uses-sdk android:minSdkVersion="4"android:targetSdkVersion="4" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".splash"
              android:label="@string/app_name" android:screenOrientation="portrait"
              android:theme="@android:style/Theme.Light.NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

<activity android:name="main" android:screenOrientation="portrait" android:theme="@android:style/Theme.Light.NoTitleBar"></activity>


Ich habe bereits eine Aktivität ohne Statusleiste, aber wenn ich auf der Virutaltastatur tippe, wird die Statusleiste angezeigt und ausgeblendet (wobei das gesamte Layout gedrückt wird), genau wie wenn Sie die Aktivität starten und die Statusleiste verschwindet. Nur dieses Mal ist es jedes Mal, wenn ich die Tastatur berühre
Jason Rogers

2

Wenn Sie eine benutzerdefinierte Ansicht verwenden, müssen Sie die Fensterfunktion anfordern, bevor Sie eine Inhaltsansicht wie diese hinzufügen

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(view);
dialog.show();

1

Verwenden Sie den folgenden Code vor setcontentview: -

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
dialog.setContentView(R.layout.custom_dialog);

Hinweis: - Der obige Code muss oben verwendet werdendialog.setContentView(R.layout.custom_dialog);

Verwenden Sie in XML ein Thema

android:theme="@android:style/Theme.NoTitleBar"

auch styles.xml:

<style name="hidetitle" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

Und dann:

Dialog dialog_hidetitle_example = new Dialog(context, R.style.hidetitle);

1

Ich bin ein Android-Neuling und bin auf diese Frage gestoßen, als ich versucht habe, eine Titelleiste loszuwerden.

Ich verwende eine Aktivität und zeige sie als Dialog an. Ich habe mich mit Themen beschäftigt und bin auf ein nützliches Standardthema gestoßen.

Hier ist der Code von mir AndroidManifest.xml, den ich verwendet habe, als die Titelleiste angezeigt wurde:

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

    >

</activity>

Hier ist die Änderung, die mir mein gewünschtes Ergebnis gebracht hat:

<activity
    android:name=".AlertDialog"
    android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"

    >

</activity>

Wie gesagt, ich bin noch neu in Android, daher kann dies unerwünschte Nebenwirkungen haben, aber es scheint mir das gewünschte Ergebnis gebracht zu haben, nämlich nur die Titelleiste aus dem Dialogfeld zu entfernen.


1

Ich benutze die nächste Variante:

Aktivität meines benutzerdefinierten Dialogs:

public class AlertDialogue extends AppCompatActivity {

    Button btnOk;
    TextView textDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_alert_dialogue);

        textDialog = (TextView)findViewById(R.id.text_dialog) ;
        textDialog.setText("Hello, I'm the dialog text!");

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

activity_alert_dialogue.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="300dp"
    android:layout_height="wrap_content"
    tools:context=".AlertDialogue">

    <TextView
        android:id="@+id/text_dialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="24dp"
        android:text="Hello, I'm the dialog text!"
        android:textColor="@android:color/darker_gray"
        android:textSize="16dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button_dialog"
        android:layout_width="wrap_content"
        android:layout_height="36dp"
        android:layout_margin="8dp"
        android:background="@android:color/transparent"
        android:text="Ok"
        android:textColor="@android:color/black"
        android:textSize="14dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/text_dialog" />


</android.support.constraint.ConstraintLayout>

Manifest:

<activity android:name=".AlertDialogue"
            android:theme="@style/AlertDialogNoTitle">
</activity>

Stil:

<style name="AlertDialogNoTitle" parent="Theme.AppCompat.Light.Dialog">
        <item name="android:windowNoTitle">true</item>
</style>

1

Bei der nächsten Variante habe ich keine Reaktion:

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); //before     
dialog.setContentView(R.layout.logindialog);

Also versuche ich als nächstes zu verwenden:

dialog.supportRequestWindowFeature(Window.FEATURE_NO_TITLE); //before     
dialog.setContentView(R.layout.logindialog);

Diese Variante funktioniert hervorragend.


0

Das hat bei mir funktioniert.

Dailog dialog = new Dialog(MyActivity.this, R.style.dialogstyle);

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="dialogstyle" parent="android:style/Theme.Dialog">
        <item name="android:windowBackground">@null</item>
        <item name="android:windowNoTitle">false</item>
    </style>
</resources>

0

Sie können diese einfache Popup-Bibliothek für Android-Dialoge ausprobieren . Es ist sehr einfach für Ihre Aktivität zu verwenden.

Wenn Sie auf die Schaltfläche "Senden" klicken, versuchen Sie, den folgenden Code zu verwenden, nachdem Sie die obige Bibliothek in Ihren Code aufgenommen haben

Pop.on(this)
   .with()
   .title(R.string.title) //ignore if not needed
   .icon(R.drawable.icon) //ignore if not needed
   .cancelable(false) //ignore if not needed
   .layout(R.layout.custom_pop)
   .when(new Pop.Yah() {
       @Override
       public void clicked(DialogInterface dialog, View view) {
           Toast.makeText(getBaseContext(), "Yah button clicked", Toast.LENGTH_LONG).show();
       }
   }).show();

Fügen Sie eine Zeile in Ihren Gradle ein und Sie können loslegen

dependencies {
    compile 'com.vistrav:pop:2.0'
}

0
**write this before adding view to dialog.**

dialog1.requestWindowFeature (Window.FEATURE_NO_TITLE);

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.