Android对话框:删除标题栏


108

我有一个奇怪的行为,无法查明原因。

我的经典应用程式

requestWindowFeature(Window.FEATURE_NO_TITLE);

删除标题/状态栏。

然后,我创建一个对话框以允许用户输入信息(名称等)

使用物理键盘,没问题,但是当我使用虚拟键盘时,我有一个奇怪的行为:

每次我在虚拟键盘上按下某个键时,标题/状态栏就会重新出现,从而推动所有键盘布局消失,然后再次消失(就像启动应用程序时的动画一样)

这是一些代码:

        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);

然后

dialog.show();

我试过了

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

但它使我的应用程序崩溃。

这是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>/>


当您使用dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)时发布您的logcat;同样在使用上面的代码行时,不要使用dialog.setTitle(“ Login:”);
ingsaurabh 2011年

感谢您的建议,但不是问题。发生的事情是,当我用键盘键入内容时,每次按键时状态栏都会不断出现和消失。
杰森·罗杰斯

Answers:


434

用,

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

感谢您的建议,但不是问题。发生的事情是,当我用键盘键入内容时,每次按键时状态栏都会不断出现和消失。
杰森·罗杰斯

9
在某些设备上,这会导致对话框布局失去其宽度,但保持其高度。我发现在.show()之前添加此代码可以修复该问题,即使它们已在xml布局中设置也是如此。dialog.getWindow()。setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);
a54studio 2015年

1
在DialogFragment的继承人的情况下,我们需要把getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);里面onCreateView
安东·霍洛文

1
如果您使用的是AppCompatDialog,请使用: dialog.supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
Firzen

24

在styles.xml中创建新样式

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

然后将其添加到清单中:

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

14

以上所有答案均不适用于AppCompatDialog

如果您使用的是AppCompatDialog,请尝试以下操作

重要说明:在调用setContentView之前进行设置。

dialog.supportRequestWindowFeature(Window.FEATURE_NO_TITLE);


谢谢,这是我的问题,使我发疯。
gregko

5

创建您的XML,该XML显示在对话框中,这里是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

您也可以在Android清单文件中定义主题,以不显示标题栏。

您只需android:theme="@android:style/Theme.Light.NoTitleBar"在活动中定义主题,而您不想显示标题栏

例:-

    <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>


我已经有一个没有状态栏的活动,但是当您在虚拟键盘上打字时,状态栏会出现并消失(按所有布局),就像您开始活动时一样,并且状态栏消失。只是这次是每次我触摸键盘时
Jason Rogers

2

如果您使用的是自定义视图,那么在添加内容视图之前请记住请求窗口功能

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

1

在setcontentview之前使用以下代码:-

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

注意:以上代码必须在上面使用dialog.setContentView(R.layout.custom_dialog);

在XML中使用主题

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

还有styles.xml:

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

然后:

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

1

我是一位Android新手,遇到了这个问题,试图摆脱标题栏。

我正在使用一个活动并将其显示为对话框。我在闲逛主题,遇到了一些有用的默认主题。

AndroidManifest.xml是标题栏显示时我使用的代码:

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

    >

</activity>

这是使我获得理想结果的更改:

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

    >

</activity>

就像我说的那样,我还是Android的新手,所以这可能会有不良的副作用,但是它似乎已经给了我想要的结果,那就是从对话框中删除标题栏。


1

我正在使用下一个变体:

我的自定义对话框的活动:

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>

表现:

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

样式:

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

1

对于下一个变体,我没有任何反应:

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

因此,我尝试使用下一个:

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

此变体效果非常好。


0

这对我有用。

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

您可以尝试这个简单的android对话框弹出库。在您的活动中使用非常简单。

单击提交按钮后,在代码中包含上述lib之后,尝试以下代码

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();

在gradle中添加一行,您就可以开始了

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.