Làm cách nào để tạo DialogFragment mà không có tiêu đề?


358

Tôi đang tạo DialogFragment để hiển thị một số thông báo trợ giúp về ứng dụng của mình. Mọi thứ đều hoạt động tốt bên cạnh một điều: Có một dải màu đen ở đầu cửa sổ hiển thị DialogFragment, mà tôi cho là được dành riêng cho tiêu đề, thứ mà tôi không muốn sử dụng.

Điều này đặc biệt đau đớn vì DialogFragment tùy chỉnh của tôi sử dụng nền trắng, do đó, sự thay đổi là quá nổi tiếng để bị bỏ qua một bên.

Hãy để tôi chỉ cho bạn điều này theo cách đồ họa hơn:

nhập mô tả hình ảnh ở đây

Bây giờ mã XML cho DialogFragment của tôi như sau:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:id="@+id/holding" 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:background="@drawable/dialog_fragment_bg"
        >
        <!-- Usamos un LinearLayout para que la imagen y el texto esten bien alineados -->
        <LinearLayout
            android:id="@+id/confirmationToast" 
            android:orientation="horizontal" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            >

            <TextView android:id="@+id/confirmationToastText" 
            android:layout_width="wrap_content"
            android:layout_height="fill_parent" 
            android:text="@string/help_dialog_fragment"
            android:textColor="#AE0000"
            android:gravity="center_vertical"
            />

        </LinearLayout>
        <LinearLayout
            android:id="@+id/confirmationButtonLL" 
            android:orientation="horizontal" 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"
            android:gravity="center_horizontal"
            >    
            <Button android:id="@+id/confirmationDialogButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:layout_marginBottom="60dp"
                android:background="@drawable/ok_button">
            </Button>
        </LinearLayout>
    </LinearLayout>
</ScrollView>

Và mã của lớp thực hiện DialogFragment:

public class HelpDialog extends DialogFragment {

    public HelpDialog() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //Inflate the XML view for the help dialog fragment
        View view = inflater.inflate(R.layout.help_dialog_fragment, container);
        TextView text = (TextView)view.findViewById(R.id.confirmationToastText);
        text.setText(Html.fromHtml(getString(R.string.help_dialog_fragment)));
        //get the OK button and add a Listener
        ((Button) view.findViewById(R.id.confirmationDialogButton)).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                 // When button is clicked, call up to owning activity.
                HelpDialog.this.dismiss();
             }
         });
        return view;
    }

}

Và quá trình tạo trong Hoạt động chính:

/**
 * Shows the HelpDialog Fragment
 */
private void showHelpDialog() {
    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    HelpDialog helpDialog = new HelpDialog();
    helpDialog.show(fm, "fragment_help");
}

Tôi thực sự không biết câu trả lời này, có liên quan đến Hộp thoại hay không, cũng phù hợp với Android: Làm cách nào để tạo Hộp thoại mà không có tiêu đề?

Làm thế nào tôi có thể thoát khỏi khu vực tiêu đề này?


Phương thức showHelpDialog này được gọi từ lớp FragmentActivity hoặc Activity ??
Sjk

80
+1 ... Tôi nghĩ rằng đây là lần đầu tiên tôi cười khi đọc câu hỏi lol
Jason Crosby

1
+1 cho sự hài hước. Giải thích đồ họa của bạn về vấn đề là chính xác tôi cảm thấy thế nào về vấn đề này!
Luis Artola

Câu trả lời:


589

Chỉ cần thêm dòng mã này vào HelpDialog.onCreateView(...)

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);

Bằng cách này, bạn rõ ràng yêu cầu để có được một cửa sổ không có tiêu đề :)


BIÊN TẬP

Như @DataGraham@Blundellchỉ ra các ý kiến ​​dưới đây, sẽ an toàn hơn khi thêm yêu cầu cho một cửa sổ không có tiêu đề trong onCreateDialog()phương thức thay vì onCreateView(). Bằng cách này, bạn có thể ngăn chặn NPE làm say mê khi bạn không sử dụng đoạn của mình dưới dạng Dialog:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
  Dialog dialog = super.onCreateDialog(savedInstanceState);

  // request a window without the title
  dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
  return dialog;
}

61
Tất nhiên, bạn cũng có thể sử dụng phương pháp tiện lợi getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE)là ...
a.bertucci

8
Có thể muốn làm điều này trong onCreateDialog thay vào đó, trong trường hợp đoạn của bạn được hiển thị không phải là một hộp thoại.
DataGraham

2
@ a.bertucci bạn là nhất! Tuy nhiên, nếu bạn thêm mảnh đó như một mảnh bình thường, getDialognó sẽ trả lại cho bạn một NPE
Blundell

4
Điều này thu nhỏ chiều rộng của hộp thoại của tôi. Bất kỳ cách giải quyết cho vấn đề này?
thợ đồng hồ

2
@clocksmith là android:layout_widththuộc tính cho chế độ xem gốc trong bố cục cho hộp thoại của bạn được đặt thành wrap_content?
ataulm

78

Đoạn đối thoại có phương thức setStyle, nên được gọi trước khi tạo Java Doc . Ngoài ra kiểu của hộp thoại có thể được đặt với cùng một phương thức

public static MyDialogFragment newInstance() {
        MyDialogFragment mDialogFragment = new MyDialogFragment();
        //Set Arguments here if needed for dialog auto recreation on screen rotation
        mDialogFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        return mDialogFragment;
}

3
Tối đa, tôi đã thử sử dụng setStype (STYLE_NO_TITLE, 0). Nhưng kết quả là hộp thoại của tôi bị cắt xuống 1/4 kích thước chiều rộng, vì vậy thông báo trong hộp thoại không được hiển thị tất cả.
vliux

1
Tôi nghĩ rằng hai cách thực sự giống nhau trong mã, từ việc xem xét các nguồn Android. Tôi cũng gặp vấn đề tương tự khi nó cũng giảm xuống còn 1/4 kích thước :(. Chưa giải quyết được.
abhishekmukherg

1
Đây là cách tốt nhất để làm điều đó.
Psypher

1
@Sam Bạn nói đúng, kiểu Cửa sổ được duy trì trong onSaveInstanceState và được khôi phục sau đó. Tôi vẫn tin rằng đó là một cách thực hành tốt hơn để khởi tạo mọi thứ trong onCreate () nói chung.
BladeCoder 3/03/2015

1
Tất cả con trực tiếp của chế độ xem gốc của bố cục của bạn phải có chiều rộng của match_parant. Sau đó, bạn sẽ nhận được một hộp thoại với chiều rộng bình thường.
nicolausYes

22
FragmentManager manager = getSupportFragmentManager();
SettingsDialog sd = new SettingsDialog();
sd.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
sd.show(manager, "settings_dialog");

1
sd.setStyle (DialogFragment.STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar) Tôi sẽ nói
Androider

OMG sau rất nhiều thử nghiệm, đây là phần duy nhất hoạt động.
Alex

16

Thử cách dễ dàng

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, 0);
}

Hoạt động tốt trên Samsung Galaxy S4.
CoolMind

11
public class LoginDialog extends DialogFragment {   
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.login_dialog, null);
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        return view;
    }   
}

10

Đặt kiểu thành Theme_Holo_Dialog_NoActionBar:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL, android.R.style.Theme_Holo_Dialog_NoActionBar);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.