DialogFragment toàn màn hình trong Android


164

Tôi đang cố gắng hiển thị DialogFragment gần như toàn màn hình. Nhưng bằng cách nào đó tôi không thể làm như vậy.

Cách tôi hiển thị Fragment là trực tiếp từ tài liệu dành cho nhà phát triển Android

FragmentManager f = ((Activity)getContext()).getFragmentManager();
FragmentTransaction ft = f.beginTransaction();
Fragment prev = f.findFragmentByTag("dialog");
if (prev != null) {
    ft.remove(prev);
}
ft.addToBackStack(null);

// Create and show the dialog.
DialogFragment newFragment = new DetailsDialogFragment();
newFragment.show(ft, "dialog");

Tôi biết ngây thơ đã cố gắng đặt RelativeLayout trong đoạn thành fill_parent và một số minWidth và minHeight.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"  
    android:minWidth="1000px" 
    android:minHeight="600px"
    android:background="#ff0000">

Tôi sẽ biết mong đợi DialogFragment sẽ chiếm phần lớn màn hình. Nhưng tôi dường như chỉ thay đổi kích thước theo chiều dọc nhưng chỉ cho đến khi một số chiều rộng cố định theo chiều ngang.

Tôi cũng đã cố gắng đặt Thuộc tính cửa sổ theo mã, như được đề xuất ở đây: http://groups.google.com/group/android-developers/browse_thread/thread/f0bb813f643604ec . Nhưng điều này cũng không giúp được gì.

Tôi có lẽ đang hiểu nhầm điều gì đó về cách Android xử lý Hộp thoại, vì tôi hoàn toàn mới với nó. Làm thế nào tôi có thể làm một cái gì đó như thế này? Có cách nào khác để đạt được mục tiêu của tôi không?


Thiết bị Android:
Asus EeePad Transformer
Android 3.0.1


Cập nhật: Bây giờ tôi đã quản lý để đưa nó vào toàn màn hình, với đoạn mã sau trong đoạn

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light);
}

Thật không may, điều này không hoàn toàn muốn tôi muốn. Tôi chắc chắn cần một "miếng đệm" nhỏ xung quanh hộp thoại để hiển thị nền.

Bất kỳ ý tưởng làm thế nào để thực hiện điều đó?



Bạn tiết kiệm thời gian của tôi, tysm
Arul Mani

Câu trả lời:


73

Hãy thử chuyển sang một LinearLayoutthay vì RelativeLayout. Tôi đã nhắm mục tiêu api 3.0 Honeycomb khi thử nghiệm.

public class FragmentDialog extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button button = (Button) findViewById(R.id.show);
    button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            showDialog();
        }
    });
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

void showDialog() {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    DialogFragment newFragment = MyDialogFragment.newInstance();
    newFragment.show(ft, "dialog");
}

public static class MyDialogFragment extends DialogFragment {

    static MyDialogFragment newInstance() {
        MyDialogFragment f = new MyDialogFragment();
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_dialog, container, false);
        return v;
    }

}
}

và các bố cục : Fragment_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:minWidth="1000dp"  
    android:minHeight="1000dp"> 
 </LinearLayout> 

tệp chính

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:background="#ffffff">
    <Button android:id="@+id/show"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:text="show">
    </Button>
</LinearLayout>

Và đối với tôi, tôi cần sử dụng RelativeLayout, nhưng độ rộng của hộp thoại không điều chỉnh đúng với nội dung, vì vậy tôi đã lồng RelativeLayout trong linearLayout có con duy nhất là RelativeLayout ... điều này đã kích hoạt các điều chỉnh độ rộng phù hợp.
Peter Ajtai

1
Tôi đã thử nghiệm mọi thứ, nhưng tôi có thể xác nhận điều duy nhất hoạt động cho DialogFragment của tôi là bao bọc toàn bộ bố cục của tôi trong linearLayout. Bằng cách đó, tôi có thể đặt chiều rộng và chiều cao của bố cục ban đầu (hiện đã được bao bọc) của mình ... lãng phí hàng giờ cho việc này
Đến

6
Đặt minWidth và minHeight trở nên lớn hơn dường như là phần quan trọng; nhưng đây là một hack thay vì một giải pháp sạch. Câu trả lời được đưa ra bởi @David bên dưới - được giải thích thêm trong liên kết mà anh ấy đưa ra - cũng hoạt động và sạch sẽ.
Garlef Wegart

@ tir38 Tôi không nghĩ điều đó đúng vì onCreateDialog () đã có một triển khai trong siêu lớp.
starkej2

Đây phải là câu trả lời được chấp nhận. Xây dựng và rõ ràng
biến đổi

179

Để tải DialogFragment trên toàn màn hình

Ghi đè onStartDialogFragment của bạn như thế này:

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        dialog.getWindow().setLayout(width, height);
    }
}

Và cảm ơn rất nhiều về bài đăng này: The-myst-of-androids-full-screen-đàm thoại


6
Chính xác thì nó hoạt động, nhưng tôi đã thử với Videoview và nó không hoạt động cho điều đó. StatusBar vẫn hiển thị. Vì vậy, điều này đã sửa cho tôi mã bên dưới: hộp thoại.getWindow (). SetFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
WhiteHorse

1
cuối cùng cũng sắp xếp, tiếng Phạn cho lời đề nghị @David
Ashu Kumar

1
Điều này làm việc tốt cho tôi. Tôi đã sử dụng ViewGroup.LayoutParams.WRAP_CONTENTcho chiều cao. Cảm ơn.
bàng hoàng

1
Đây là sạch sẽ và không hacky
rommex

7
Điều này không làm việc cho trường hợp của tôi .. nó hiển thị một số phần đệm từ tất cả các góc. Có ai giúp đỡ không?
Abdul Waheed

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

    setStyle(DialogFragment.STYLE_NORMAL,
             android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}

7
Giải pháp duy nhất có vẻ hiệu quả với tôi. Những người khác đôi khi làm việc, đôi khi không. Hãy hy vọng tôi cũng không tìm thấy ngoại lệ cho cái này :)
azertiti 22/03/13

12
Điều này cũng phù hợp với tôi. Trong khi bạn muốn nền trong suốt, bạn nên sử dụng '' 'android.R.style.Theme_Translucent_NoTitleBar' ''
acntwww

2
Khóa đang vượt qua STYLE_NORMAL. Điều này làm cho hộp thoại để lấp đầy màn hình giống như bất kỳ hoạt động nào khác. Chúng tôi có thể sử dụng bất kỳ chủ đề. Đối với thiết kế vật liệu, bạn có thể lấy ra một chủ đề vật liệu (ví dụ Theme.AppCompat.NoActionBar để giữ trang trí hệ thống nhưng loại bỏ thanh hành động).
rpattabi

2
Ha-ha, khi tôi ra mắt, một màn hình đen xuất hiện và tôi nghĩ nó đã bị đóng băng. Sau đó, tôi đã thay đổi một chủ đề thành Theme_Light_NoTitleBar_Fullscreen. Cảm ơn, một hộp thoại chiếm toàn bộ màn hình (bao gồm cả thanh trạng thái).
CoolMind

1
Theme_DeviceDefault_Light_NoActionBar_Fullscreen hộp thoại fow với nền trắng.
Hitesh Sahu

45

Theo liên kết này, toàn màn hình DialogFragment hiển thị phần đệm ở hai bên, nó sẽ hoạt động như một bùa.

@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {

    // the content
    final RelativeLayout root = new RelativeLayout(getActivity());
    root.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

    // creating the fullscreen dialog
    final Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(root);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    return dialog;
}

4
Hoạt động tuyệt vời, ngay cả trong năm 2018! (không có gì khác đã làm) Cảm ơn.
Ứng dụng tự động

2
Đây là câu trả lời hoàn hảo ngay cả trong Android Studio 3.1+ năm 2018, tốt hơn so với các câu trả lời khác tồn tại ở đây. Câu trả lời khác sẽ phá vỡ giao diện người dùng Android như cardview, spinner, v.v.
Taufik Nur Rahmanda

1
Hoạt động quyến rũ vào năm 2020!
Yue Yin

Hoạt động nhưng nếu bạn muốn xác định lề trong bố cục XML của mình, bạn sẽ phải bọc các khung nhìn của mình bằng một bố cục khác, nếu không thì các lề sẽ bị bỏ qua.
Felipe Ribeiro R. Magalhaes

29

Tạo hộp thoại toàn màn hình bằng cách chỉ sử dụng kiểu

Giải pháp đầu tiên

1. Thêm vào của bạn style.xml:

    <style name="FullScreenDialog" parent="Theme.AppCompat.Light.Dialog">
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:padding">0dp</item>
        <item name="android:windowIsFloating">false</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

2. Thêm vào DialogFragment của bạn:

@Override
public int getTheme() {
    return R.style.FullScreenDialog;
}

Giải pháp thay thế

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setStyle(DialogFragment.STYLE_NO_FRAME, R.style.AppTheme)
}

nơi AppThemelà chủ đề bạn định nghĩa trong phong cách.


Đây là cách thanh lịch hơn câu trả lời của bradley4.
MeLine

giải pháp hoàn hảo một dòng
me_

Cả hai giải pháp đều hoạt động, nhưng giải pháp đầu tiên gây ra lỗi với cửa sổ bật lên clipboard. Giải pháp thay thế hoạt động tốt
Janusz Hain

18

Trong trường hợp của tôi, tôi đã sử dụng cách tiếp cận sau:

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
}

Cộng với linearLayout để lấp đầy tất cả không gian với nội dung.

Nhưng vẫn còn những khoảng trống nhỏ giữa các cạnh trái và phải của hộp thoại và các cạnh màn hình trên một số thiết bị Lollipop + (ví dụ Nexus 9).

Điều đó không rõ ràng nhưng cuối cùng tôi đã tìm ra rằng để làm cho nó có chiều rộng đầy đủ trên tất cả các nền của cửa sổ thiết bị và nền tảng nên được chỉ định bên trong tệp kiểu tệp như sau:

<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog">
    <item name="android:windowNoTitle">true</item>
    <item name="android:padding">0dp</item>
    <item name="android:windowBackground">@color/window_bg</item>
</style>

Và tất nhiên phong cách này cần được sử dụng khi chúng ta tạo hộp thoại như sau:

    public static DialogFragment createNoTitleDlg() {
        DialogFragment frag = new Some_Dialog_Frag();
        frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
        return frag;
}

Đây là câu trả lời. Công trình tuyệt vời.
VonSchnauzer

2
Tôi đã thử hầu hết các câu trả lời trên chủ đề này, một số đã hoạt động, nhưng tôi đã mất tất cả các kiểu chủ đề compat ứng dụng của mình. Tôi hy vọng cái này sẽ hoạt động như chủ đề chính là AppCompat. Nó gần như đã làm việc. Đối với tôi, tôi đã phải thêm 2 kiểu bổ sung: <item name="android:windowFullscreen">true</item> <item name="android:windowIsFloating">false</item> Nguồn: TechRepublic
Breeno

15

Tôi đã gặp vấn đề trước đây khi sử dụng hộp thoại toàn màn hình: luôn có phần đệm trong khi đặt chế độ toàn màn hình. thử mã này trong phương thức onActivityCreated () của hộp thoại:

public void onActivityCreated(Bundle savedInstanceState)
{   
    super.onActivityCreated(savedInstanceState);
    Window window = getDialog().getWindow();
    LayoutParams attributes = window.getAttributes();
    //must setBackgroundDrawable(TRANSPARENT) in onActivityCreated()
    window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    if (needFullScreen)
    {
        window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
}

Nó hoạt động, các giải pháp khác thay đổi chủ đề của các nút và các yếu tố khác của đoạn.
Yhondri

11

Theo như API Android đã được cập nhật, phương pháp được đề xuất để hiển thị hộp thoại toàn màn hình là như sau:

FragmentTransaction transaction = this.mFragmentManager.beginTransaction();
// For a little polish, specify a transition animation
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
transaction.add(android.R.id.content, this.mFragmentToShow).commit();

mặt khác, nếu bạn không muốn nó được hiển thị toàn màn hình, bạn có thể làm theo cách này:

this.mFragmentToShow.show(this.mFragmentManager, LOGTAG);

Hy vọng nó giúp.

BIÊN TẬP

Hãy lưu ý rằng giải pháp tôi đưa ra có hiệu quả nhưng có một điểm yếu đôi khi có thể gây rắc rối. Thêm DialogFragment vào vùng android.R.id.contentchứa sẽ không cho phép bạn xử lý DialogFragment#setCancelable()chính xác tính năng này và có thể dẫn đến các hành vi không mong muốn khi thêm DialogFragment vào ngăn xếp phía sau.

Vì vậy, tôi đã đề nghị bạn đơn giản thay đổi kiểu cách DialogFragment của bạn trong phương thức onCreate như sau:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Translucent_NoTitleBar);
}

Hy vọng nó giúp.


1
Tôi đồng ý. Dưới đây là lời giải thích đầy đủ từ Hướng dẫn dành cho nhà phát triển Android: link
user2274431

10

Hãy thử sử dụng setStyle () trong hộp thoại onCreate và ghi đè hộp thoại tạo onCreateDialog không có tiêu đề

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme);        
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);        
    return dialog;
}

hoặc chỉ ghi đè onCreate () và setStyle đồng mã.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    
    setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme);        
}

8

Nó thực sự có thể phụ thuộc vào cách bố trí được xác định. Nhưng để đảm bảo rằng hộp thoại có kích thước theo yêu cầu, giải pháp tốt nhất là cung cấp LayoutParams sau khi hộp thoại được hiển thị (và không phải khi tạo). Trên DialogFragment, hộp thoại được hiển thị trên phương thức onStart , vì vậy một phương thức hợp lệ để có được chiều rộng đầy đủ là:

@Override public void onStart() {
    super.onStart();
    Dialog d = getDialog();
    if (d!=null){
        d.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    }
}

Để cũng cung cấp một chủ đề hoặc kiểu, như kiểu NO_TITLE, vị trí tốt nhất là trên phương thức onCreate :

@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog);
}

6

Lưu ý: Ngay cả một người có thể tìm thấy câu trả lời đúng ở đây. Nhưng tôi muốn làm rõ một sự nhầm lẫn.

Sử dụng mã dưới đây cho android.app.DialogFragment

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        dialog.getWindow().setLayout(width, height);
    }
}

Sử dụng mã dưới đây cho android.support.v4.app.DialogFragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}

6

Và phiên bản kotlin!

override fun onStart() {
    super.onStart()
    dialog?.let {
        val width = ViewGroup.LayoutParams.MATCH_PARENT
        val height = ViewGroup.LayoutParams.MATCH_PARENT
        it.window?.setLayout(width, height)
    }
}

1
Nó thật sự có hiệu quả! Ngoài ra tôi muốn thêm, nhà phát triển nên bọc nội dung hộp thoại bằng FrameLayout trong suốt, để tránh biến dạng nội dung.
Georgiy Chebotarev

4

Đây là giải pháp làm thế nào tôi tìm ra vấn đề này:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);    
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);   

    return dialog;
}

@Override
public void onStart() {
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null) {
            dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    }
}

3

Tạo chủ đề dưới đây trong style.xml của bạn:

<style name="DialogTheme" parent="Theme.AppCompat.Light.DarkActionBar">
   <item name="android:paddingRight">0dp</item>
   <item name="android:paddingLeft">0dp</item>
   <item name="android:layout_width">match_parent</item>
   <item name="android:windowNoTitle">true</item>
</style>

sau đó đặt kiểu trong DialogFragment

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogTheme);
}

2

Chirag Nagariya đúng ngoại trừ bổ sung '_Fullscreen'. nó có thể được giải quyết bằng cách sử dụng bất kỳ kiểu cơ sở nào không xuất phát từ kiểu Hộp thoại. 'android.R.style.Theme_Black_NoTitleBar' cũng có thể được sử dụng.


1

Trong trường hợp bất kỳ ai khác gặp phải điều này, tôi đã có trải nghiệm tương tự với điều này nhưng hóa ra vấn đề là tôi đã quên trả lại chế độ xem bị thổi phồng từ onCreateView (thay vào đó trả về super.onCreateView mặc định). Tôi chỉ đơn giản trả lại quan điểm tăng cao chính xác và điều đó đã giải quyết vấn đề.


1
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new Dialog(getActivity(), android.R.style.Theme_Holo_Light);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

    return dialog;
}

Giải pháp này áp dụng một chủ đề toàn màn hình trên hộp thoại, tương tự như setStyle của Chirag trong onCreate. Một nhược điểm là saveInstanceState không được sử dụng.


1

Hãy thử điều này cho hộp thoại đoạn phổ biến cho nhiều mục đích sử dụng. Hy vọng điều này sẽ giúp bạn đặt cược

public class DialogFragment extends DialogFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_visit_history_main, container, false);

        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        initializeUI(rootView);
        return rootView;
    }

    @Override
    public void onStart() {
        super.onStart();
        Dialog dialog = getDialog();
        if (dialog != null) {
            int width = ViewGroup.LayoutParams.MATCH_PARENT;
            int height = ViewGroup.LayoutParams.MATCH_PARENT;
            dialog.getWindow().setLayout(width, height);
        }
    }
    private void initializeUI(View rootView) {
    //getChildFragmentManager().beginTransaction().replace(R.id.fv_container,FragmentVisitHistory.getInstance(), AppConstant.FRAGMENT_VISIT_HISTORY).commit();
    }
}

vui lòng tham khảo câu hỏi này - stackoverflow.com/questions/45494644/ từ
Aman Verma

1

Đây là những gì bạn cần đặt thành đoạn:

/* theme is optional, I am using leanback... */
setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);

Trong trường hợp của bạn:

DialogFragment newFragment = new DetailsDialogFragment();
newFragment.setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);
newFragment.show(ft, "dialog");

Và tại sao? Bởi vì DialogFragment (khi không được nói rõ ràng), sẽ sử dụng các kiểu bên trong của nó sẽ bao bọc bố cục tùy chỉnh của bạn trong đó (không có toàn màn hình, v.v.).

Và bố cục? Không có cách hacky cần thiết, điều này chỉ hoạt động tốt:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    ...
</RelativeLayout>

Thưởng thức


1

Tôi rất muộn vì đã trả lời câu hỏi này nhưng tôi vẫn muốn chia sẻ câu trả lời này để trong tương lai ai cũng có thể sử dụng nó.

Tôi đã sử dụng mã này trong dự án của mình, nó hoạt động ở phiên bản thấp hơn cũng như phiên bản cao hơn.

Chỉ cần sử dụng chủ đề này bên trong onCreateDialog () như thế này:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_pump_details, null);

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_Black_NoTitleBar_Fullscreen);
    return builder.create();
}

android.R.style.Theme_Black_NoTitleBar_Fullscreen - Đây là mã nguồn cho chủ đề này, bạn chỉ có thể thấy chủ đề này là đủ để DialogFragment xuất hiện trên toàn màn hình.

<!-- Variant of {@link #Theme_Black} that has no title bar and
     no status bar.  This theme
     sets {@link android.R.attr#windowFullscreen} to true.  -->
<style name="Theme.Black.NoTitleBar.Fullscreen">
    <item name="windowFullscreen">true</item>
    <item name="windowContentOverlay">@null</item>
</style>

Xin vui lòng cho tôi biết nếu bất cứ ai phải đối mặt với bất kỳ vấn đề. Hy vọng điều này là hữu ích. Cảm ơn :)


Hộp thoại xuất hiện toàn màn hình nhưng mọi thứ trở nên tối đen trừ một nút. bất kỳ ý tưởng ??
Sagar Nayak

1

Cách sau đây sẽ hoạt động ngay cả khi bạn đang làm việc trên một bố cục tương đối. Thực hiện theo các bước sau:

  1. Chuyển đến trình chỉnh sửa chủ đề (Có sẵn trong Công cụ-> Android -> Trình chỉnh sửa chủ đề)
  2. Chọn hiển thị tất cả các chủ đề. Chọn một cái có AppCompat.Dialog
  3. Chọn tùy chọn nền cửa sổ android nếu bạn muốn nó là bất kỳ nền màu cụ thể hoặc trong suốt.
  4. Chọn màu và nhấn OK. Chọn tên của chủ đề mới.
  5. Đi tới tệp XML và sau đó theo chủ đề vừa thêm, hãy thêm hai thuộc tính sau:

    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>

Cài đặt chủ đề của tôi cho hộp thoại như dưới đây:

<style name="DialogTheme" parent="Theme.AppCompat.Dialog" >
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>

Hãy chắc chắn rằng chủ đề có cha mẹ là Theme.AppCompat.Dialog Một cách khác sẽ là tạo một kiểu mới trong tệp style.xml và thay đổi nó theo mã ở trên.

  1. Chuyển đến lớp Đoạn thoại của bạn và trong phương thức onCreate () , đặt kiểu của Hộp thoại của bạn là:

    @Override void công khai onCreate (@Nullable Gói đã lưuInstanceState) {super.onCreate (yetInstanceState); setStyle (DialogFragment.STYLE_NORMAL, R.style.DialogTheme); }


1

Thêm dòng này bên dưới theo kiểu của hộp thoại toàn màn hình.

<item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsFloating">false</item>

hoặc: ghi đè lên trò chơi onCreate (yetInstanceState: Bundle?) {super.onCreate (yetInstanceState) setStyle (DialogFragment.STYLE_NORMAL, R.style.BottomSheetDialogThemeNoFloating), theo phong cách của họ tên mặt hàng = "android: windowIsFloating"> sai </ item> </ style>
Filipkowicz

0

window.setLayout không đủ cho các thiết bị cũ.

Đây là những gì tôi làm:

try {
    ViewGroup parent = (ViewGroup) view;
    do {
        parent = (ViewGroup) parent.getParent();
        if (parent == null)
            break;

        parent.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
        parent.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
        parent.requestLayout();
    } while (true);
} catch (Exception e){}

0
This below answer works for me in fragment dialog.  


  Dialog dialog = getDialog();
        if (dialog != null)
        {
            int width = ViewGroup.LayoutParams.MATCH_PARENT;
            int height = ViewGroup.LayoutParams.MATCH_PARENT;
            dialog.getWindow().setLayout(width, height);
        }

0

Một giải pháp bằng cách sử dụng cái mới ConstraintLayoutlà bọc ConstraintLayouttrong một LinearLayoutvới minHeight và minWidth cố định. Không có gói, ConstraintLayout sẽ không có kích thước phù hợp cho Hộp thoại.

<?xml version="1.0" encoding="utf-8"?>
<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="match_parent"
    android:minWidth="1000dp"
    android:minHeight="1000dp"
    android:orientation="vertical">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/background_color"
        android:orientation="vertical">
        <!-- some constrained views -->
    </androidx.constraintlayout.widget.ConstraintLayout>

</LinearLayout>

0

Làm việc cho tôi ở Kotlin,

 override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)

}

0

giải pháp sau đây hiệu quả với tôi, giải pháp khác cho tôi một khoảng trống ở hai bên tức là không toàn màn hình

Bạn cần thay đổi phương thức onStart và onCreate

@Override
public void onStart() {
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        dialog.getWindow().setLayout(width, height);
    }
}


 public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    final Dialog dialog = new Dialog(requireContext());
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
 }


   
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.