DialogFragment เต็มหน้าจอใน Android


165

ฉันพยายามแสดง DialogFragment แบบเกือบเต็มจอ แต่ฉันก็ไม่สามารถทำได้

วิธีที่ฉันแสดง Fragment นั้นตรงจากเอกสารของนักพัฒนา 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");

ฉันรู้ว่าจะพยายามตั้งค่า RelativeLayout อย่างไร้เดียงสาเป็นส่วนย่อยเพื่อเติม _parent และบาง minWidth และ 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">

ฉันคาดหวังว่า DialogFragment จะเต็มหน้าจอส่วนใหญ่ แต่ดูเหมือนว่าฉันจะปรับขนาดในแนวตั้งเท่านั้นจนกว่าจะมีความกว้างคงที่ในแนวนอน

ฉันยังพยายามที่จะตั้งแอตทริบิวต์หน้าต่างในรหัสตามที่แนะนำที่นี่: http://groups.google.com/group/android-developers/browse_thread/thread/f0bb813f643604ec แต่นี่ก็ไม่ได้ช่วยอะไรเช่นกัน

ฉันอาจเข้าใจผิดบางอย่างเกี่ยวกับวิธีที่ Android ใช้จัดการกล่องโต้ตอบเนื่องจากฉันเป็นคนใหม่ ฉันจะทำสิ่งนี้ได้อย่างไร มีวิธีอื่นในการบรรลุเป้าหมายของฉันหรือไม่?


อุปกรณ์ Android:
Asus EeePad Transformer
Android 3.0.1


อัปเดต: ตอนนี้ฉันจัดการเพื่อให้เต็มหน้าจอด้วยรหัสต่อไปนี้ในส่วน

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

น่าเสียดายที่ฉันไม่ต้องการมัน ฉันต้องการ "ช่องว่างภายใน" เล็ก ๆ รอบกล่องโต้ตอบเพื่อแสดงพื้นหลัง

แนวคิดใดที่จะทำให้สำเร็จ?


2
อ่านดี: techrepublic.com/article/…
kouretinho

คุณประหยัดเวลาของฉัน tysm
Arul Mani

คำตอบ:


73

ลองเปลี่ยนมาใช้แทนLinearLayout RelativeLayoutฉันกำลังกำหนดเป้าหมาย 3.0 Honeycomb api เมื่อทำการทดสอบ

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

}
}

และเค้าโครง : 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> 

main.xml

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

และสำหรับฉันฉันต้องใช้ RelativeLayout แต่ความกว้างของกล่องโต้ตอบไม่ได้ปรับอย่างเหมาะสมกับเนื้อหาดังนั้นฉันจึงซ้อน RelativeLayout ใน LinearLayout ซึ่งลูกคนเดียวคือ RelativeLayout ... นี่เป็นการกระตุ้นการปรับความกว้างที่เหมาะสม
ปีเตอร์ Ajtai

1
ฉันทดสอบทุกอย่างแล้ว แต่ฉันสามารถยืนยันสิ่งเดียวที่ใช้ได้กับ DialogFragment ของฉันนั่นคือการวางเลย์เอาต์ทั้งหมดของฉันใน LinearLayout ด้วยวิธีนี้ฉันสามารถตั้งค่าความกว้างและความสูงของเลย์เอาต์ต้นฉบับของฉัน (ตอนนี้ห่อ) ... เสียเวลาในการนี้
จนถึง

6
การตั้งค่า minWidth และ minHeight ให้เป็นคนที่มีขนาดใหญ่น่าจะเป็นส่วนสำคัญ แต่นี่เป็นแฮ็คแทนที่จะเป็นโซลูชันที่สะอาด คำตอบที่ได้รับจาก @David ด้านล่าง - อธิบายเพิ่มเติมในลิงก์ที่เขาให้ - ใช้งานได้และสะอาด
Garlef Wegart

@ tir38 ฉันไม่คิดว่าเป็นจริงเพราะ onCreateDialog () มีการนำไปใช้ในซูเปอร์คลาสแล้ว
starkej2

นี่ควรเป็นคำตอบที่ยอมรับได้ บรรจงและชัดเจน
mutiemule

179

เพื่อรับ DialogFragment แบบเต็มหน้าจอ

แทนที่onStartDialogFragment ของคุณเช่นนี้

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

และขอบคุณมากสำหรับโพสต์นี้: ความลึกลับของหุ่นยนต์เต็มหน้าจอกล่องโต้ตอบ


6
ตรงนี้ใช้งานได้ แต่ฉันลองกับ Videoview แล้วมันก็ใช้ไม่ได้ StatusBar ยังคงแสดงให้เห็น ดังนั้นนี่คงฉันด้านล่างรหัส: dialog.getWindow (). setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
WhiteHorse

1
ในที่สุดก็แยกออก, ขอบคุณสำหรับคำแนะนำ @David
Ashu Kumar

1
มันทำงานได้ดีสำหรับฉัน ฉันใช้ViewGroup.LayoutParams.WRAP_CONTENTสำหรับความสูง ขอบคุณ
งงงวย

1
นี่สะอาดและไม่
ยุ่งเหยิง

7
นี่ไม่ทำงานสำหรับกรณีของฉัน .. มันแสดงให้เห็นถึงช่องว่างภายในบางส่วนจากทุกมุม ความช่วยเหลือใด ๆ
Abdul Waheed

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

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

7
ทางออกเดียวที่ดูเหมือนจะได้ผลสำหรับฉัน บางคนทำงานได้บางครั้งก็ไม่ หวังว่าฉันจะไม่พบข้อยกเว้นสำหรับตัวนี้เช่นกัน :)
azertiti

12
วิธีนี้ใช้ได้สำหรับฉันด้วยในขณะที่ถ้าคุณต้องการให้พื้นหลังมีความโปร่งใสคุณควรใช้ '' 'android.R.style.Theme_Translucent_NoTitleBar' ''
acntwww

2
กุญแจนี้กำลังผ่าน STYLE_NORMAL สิ่งนี้ทำให้กล่องโต้ตอบเพื่อเติมหน้าจอเหมือนกับกิจกรรมอื่น ๆ เราสามารถใช้ชุดรูปแบบใดก็ได้ สำหรับการออกแบบวัสดุคุณสามารถได้รับชุดรูปแบบวัสดุ (เช่น Theme.AppCompat.NoActionBar ซึ่งยังคงการตกแต่งระบบ แต่เอาแถบการกระทำออก)
rpattabi

2
Ha-ha เมื่อฉันเปิดตัวหน้าจอสีดำปรากฏขึ้นและฉันคิดว่ามันค้าง จากนั้นฉันเปลี่ยนธีมเป็น Theme_Light_NoTitleBar_Fullscreen ขอขอบคุณไดอะล็อกใช้ทั้งหน้าจอ (รวมถึงแถบสถานะ)
CoolMind

1
Theme_DeviceDefault_Light_NoActionBar_Fullscreen กล่องโต้ตอบ fow พร้อมพื้นหลังสีขาว
Hitesh Sahu

45

ตามลิงค์นี้DialogFragment แบบเต็มหน้าจอจะแสดงการเติมด้านข้างซึ่งจะทำงานเหมือนมีเสน่ห์

@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
ใช้งานได้ดีแม้ในปี 2018! (ไม่มีอะไรอื่น) ขอบคุณ
AutonomousApps

2
นี่คือคำตอบที่สมบูรณ์แบบแม้ใน Android Studio 3.1+ ในปี 2018 ดีกว่าคำตอบอื่น ๆ ที่มีอยู่ที่นี่ คำตอบอื่น ๆ จะทำลาย UI ของ Android เช่น cardview, spinner และอื่น ๆ
Taufik Nur Rahmanda

1
ทำงานได้อย่างมีเสน่ห์ในปี 2020!
Yue Yin

ใช้งานได้ แต่ถ้าคุณต้องการกำหนดระยะขอบในเค้าโครง XML ของคุณคุณจะต้องตัดมุมมองของคุณด้วยเค้าโครงอื่นมิฉะนั้นระยะขอบจะถูกละเว้น
Felipe Ribeiro R. Magalhaes

30

สร้าง DialogFragment แบบเต็มหน้าจอโดยใช้สไตล์เท่านั้น

ทางออกแรก

1. เพิ่มในของคุณ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. เพิ่มใน DialogFragment ของคุณ:

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

ทางเลือกการแก้ปัญหา

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

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

ที่AppThemeอยู่ในรูปแบบที่คุณกำหนดไว้ในรูปแบบ


นี่เป็นวิธีที่หรูหรากว่าคำตอบของ bradley4
MeLine

วิธีการแก้ปัญหาหนึ่งบรรทัดที่สมบูรณ์แบบ
me_

ทั้งสองวิธีใช้งานได้ แต่ตัวแรกทำให้เกิดบั๊กที่มีป๊อปอัปคลิปบอร์ด ทางเลือกใช้งานได้ดี
Janusz Hain

18

ในกรณีของฉันฉันใช้วิธีการต่อไปนี้:

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

เพิ่ม LinearLayout เพื่อเติมเต็มพื้นที่ทั้งหมดด้วยเนื้อหา

แต่ยังมีช่องว่างเล็ก ๆระหว่างขอบด้านซ้ายและด้านขวาของกล่องโต้ตอบและขอบหน้าจอในอุปกรณ์ Lollipop + (เช่น Nexus 9)

ไม่ชัดเจน แต่ในที่สุดฉันก็พบว่าเพื่อให้เต็มความกว้างของอุปกรณ์และแพลตฟอร์มพื้นหลังหน้าต่างทั้งหมดควรมีการระบุไว้ในstyles.xmlดังนี้:

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

และแน่นอนว่าต้องใช้สไตล์นี้เมื่อเราสร้างกล่องโต้ตอบดังต่อไปนี้:

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

นี่คือคำตอบ ใช้งานได้ดี
VonSchnauzer

2
ฉันลองคำตอบส่วนใหญ่ในกระทู้นี้แล้วใช้งานได้บางส่วน แต่ฉันทำหายไปหมดทุกรูปแบบธีมแอป ฉันหวังว่าสิ่งนี้จะใช้งานได้เนื่องจากธีมหลักคือ AppCompat มันเกือบจะได้ผล สำหรับฉันฉันต้องเพิ่ม 2 สไตล์เพิ่มเติม: <item name="android:windowFullscreen">true</item> <item name="android:windowIsFloating">false</item> ที่มา: TechRepublic
Breeno

15

ฉันพบปัญหาก่อนเมื่อใช้กล่องโต้ตอบแบบเต็มหน้าจอการจัดเรียง: มีช่องว่างภายในเสมอขณะที่ตั้งค่าเต็มหน้าจอ ลองใช้รหัสนี้ในเมธอด onActivityCreated () ของ dialogFragment:

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

ใช้งานได้โซลูชันอื่นเปลี่ยนธีมของปุ่มและองค์ประกอบอื่น ๆ ของแฟรกเมนต์
Yhondri

11

เท่าที่ Android API ได้รับการปรับปรุงวิธีการที่แนะนำให้แสดงกล่องโต้ตอบแบบเต็มหน้าจอมีดังต่อไปนี้:

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

มิฉะนั้นหากคุณไม่ต้องการให้แสดงแบบเต็มหน้าจอคุณสามารถทำได้ดังนี้:

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

หวังว่ามันจะช่วย

แก้ไข

ระวังให้ดีว่าวิธีแก้ปัญหาที่ฉันให้นั้นมีจุดอ่อนที่บางครั้งอาจมีปัญหา การเพิ่ม DialogFragment ลงในandroid.R.id.contentคอนเทนเนอร์จะไม่ช่วยให้คุณสามารถจัดการDialogFragment#setCancelable()คุณสมบัติได้อย่างถูกต้องและอาจนำไปสู่พฤติกรรมที่ไม่คาดคิดเมื่อเพิ่ม DialogFragment ลงในสแต็กหลังเช่นกัน

ดังนั้นฉันขอแนะนำให้คุณเปลี่ยนสไตล์ของ DialogFragment ของคุณในเมธอด onCreate ดังนี้

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

หวังว่ามันจะช่วย


1
ฉันเห็นด้วย. นี่คือคำอธิบายโดยละเอียดจากคู่มือนักพัฒนาซอฟต์แวร์ Android: ลิงก์
user2274431

10

ลองใช้ setStyle () ใน onCreate และแทนที่ onCreateDialog ทำให้ไดอะล็อกไม่มีชื่อ

@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;
}

หรือเพียงแค่แทนที่ onCreate () และ setStyle รหัสเพื่อน

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

8

แน่นอนมันสามารถขึ้นอยู่กับวิธีการกำหนดเค้าโครง แต่เพื่อให้แน่ใจว่าไดอะล็อกมีขนาดที่ต้องการทางออกที่ดีที่สุดคือการจัดวาง LayoutParams เมื่อไดอะล็อกปรากฏขึ้น (ไม่ใช่การสร้าง) บน DialogFragment ไดอะล็อกจะแสดงบนเมธอดonStartดังนั้นวิธีที่ถูกต้องในการรับความกว้างเต็มคือ:

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

ในการระบุธีมหรือสไตล์เช่นเดียวกับสไตล์ NO_TITLE ตำแหน่งที่ดีที่สุดคือวิธีการonCreate :

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

7

หมายเหตุ:แม้แต่คนเดียวก็สามารถหาคำตอบได้ที่นี่ แต่ฉันต้องการชี้แจงความสับสน

ใช้รหัสด้านล่างสำหรับ 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);
    }
}

ใช้รหัสด้านล่างสำหรับ 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

และรุ่น 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
มันได้ผลจริงๆ! นอกจากนี้ฉันต้องการเพิ่มนักพัฒนาควรห่อเนื้อหาโต้ตอบโดย FrameLayout โปร่งใสเพื่อหลีกเลี่ยงการเสียรูปของเนื้อหา
Georgiy Chebotarev

4

นี่เป็นวิธีแก้ปัญหาที่ฉันพบปัญหานี้:

@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

สร้างธีมด้านล่างใน style.xml ของคุณ:

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

จากนั้นตั้งค่าสไตล์ใน DialogFragment

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

2

Chirag Nagariya นั้นถูกต้องยกเว้นการเพิ่ม '_Fullscreen' มันสามารถแก้ไขได้โดยใช้รูปแบบฐานใด ๆ ที่ไม่ได้มาจากรูปแบบโต้ตอบ 'android.R.style.Theme_Black_NoTitleBar' สามารถใช้งานได้เช่นกัน


1

ในกรณีที่คนอื่นเจอสิ่งนี้ฉันมีประสบการณ์คล้ายกัน แต่ปรากฎว่าปัญหาคือฉันลืมคืนมุมมองที่สูงเกินจริงจาก onCreateView (แทนที่จะส่งคืนค่าเริ่มต้น super.onCreateView) ฉันเพียงแค่คืนค่ามุมมองที่สูงเกินจริงที่ถูกต้องแล้วนั่นก็แก้ปัญหาได้


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

โซลูชันนี้ใช้ชุดรูปแบบเต็มหน้าจอในกล่องโต้ตอบซึ่งคล้ายกับ setStyle ของ Chirag ใน onCreate ข้อเสียคือไม่ได้ใช้ SaveInstanceState


1

ลองทำเช่นนี้เพื่อหากล่องโต้ตอบแฟรกเมนต์ทั่วไปสำหรับการใช้งานหลายครั้ง หวังว่าสิ่งนี้จะช่วยให้นักพนันของคุณ

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

โปรดดูคำถามนี้ - stackoverflow.com/questions/45494644/…
Aman Verma

1

นี่คือสิ่งที่คุณต้องตั้งค่าเป็นแฟรกเมนต์:

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

ในกรณีของคุณ:

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

และทำไม? เนื่องจาก DialogFragment (เมื่อไม่ได้บอกอย่างชัดเจน) จะใช้สไตล์ภายในของมันที่จะห่อเค้าโครงที่กำหนดเองของคุณไว้ในนั้น (ไม่มีแบบเต็มหน้าจอ ฯลฯ )

และเลย์เอาต์? ไม่จำเป็นต้องใช้วิธีแฮ็คนี่ทำงานได้ดี:

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

สนุก


1

ฉันสายเกินไปที่จะตอบคำถามนี้ฉันยังต้องการแบ่งปันคำตอบนี้เพื่อที่ในอนาคตทุกคนจะสามารถใช้สิ่งนี้ได้

ฉันใช้รหัสนี้ในโครงการของฉันมันใช้งานได้ในรุ่นที่ต่ำกว่าเช่นเดียวกับรุ่นที่สูงกว่า

เพียงใช้ชุดรูปแบบนี้ภายใน onCreateDialog () เช่นนี้:

@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 - นี่คือซอร์สโค้ดสำหรับธีมนี้คุณสามารถดูได้เฉพาะธีมนี้เพียงพอที่จะทำให้ DialogFragment ปรากฏขึ้นเต็มหน้าจอ

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

โปรดแจ้งให้เราทราบหากใครประสบปัญหาใด ๆ หวังว่านี่จะเป็นประโยชน์ ขอบคุณ :)


ข้อความโต้ตอบแบบเต็มหน้าจอ แต่ทุกอย่างกลายเป็นสีดำยกเว้นปุ่ม ความคิดใด ๆ ??
Sagar Nayak

1

วิธีต่อไปนี้จะใช้งานได้แม้ว่าคุณกำลังใช้งานเค้าโครงที่สัมพันธ์กัน ทำตามขั้นตอนต่อไปนี้:

  1. ไปที่ตัวแก้ไขธีม(มีให้ใต้เครื่องมือ -> Android -> ตัวแก้ไขธีม)
  2. เลือกแสดงธีมทั้งหมด เลือกหนึ่งด้วยAppCompat.Dialog
  3. เลือกตัวเลือกพื้นหลังหน้าต่าง android ถ้าคุณต้องการให้เป็นพื้นหลังสีเฉพาะหรือแบบโปร่งใส
  4. เลือกสีและกดตกลงเลือกชื่อของชุดรูปแบบใหม่
  5. ไปที่styles.xmlจากนั้นภายใต้ธีมที่เพิ่งเพิ่มให้เพิ่มสองคุณลักษณะนี้:

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

การตั้งค่าธีมของฉันสำหรับกล่องโต้ตอบอยู่ภายใต้:

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

ตรวจสอบให้แน่ใจว่าชุดรูปแบบมีพาเรนต์เป็นTheme.AppCompat.Dialog อีกวิธีหนึ่งคือสร้างสไตล์ใหม่ใน styles.xml และเปลี่ยนตามรหัสด้านบน

  1. ไปที่คลาส Dialog Fragment ของคุณและในเมธอด onCreate ()ให้ตั้งค่าสไตล์ของ Dialog ของคุณเป็น:

    @Override โมฆะสาธารณะ onCreate (@Nullable Bundle บันทึกInstanceState) {super.onCreate (บันทึกไว้ InstanceState); setStyle (DialogFragment.STYLE_NORMAL, R.style.DialogTheme); }


1

เพิ่มบรรทัดด้านล่างนี้ในรูปแบบของกล่องโต้ตอบแบบเต็มหน้าจอ

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

หรือ: แทนที่ความสนุก onCreate (ที่บันทึกไว้อินสแตนท์: บันเดิล?) {super.onCreate (ที่บันทึกไว้ในที่เก็บข้อมูล) "ชุดรูปแบบ" การปกครอง "<DialogFragment.STYLE_NORMAL, R.style.BottomSheetDialogThemeNoFloating) <สไตล์ item name = "android: windowIsFloating"> false </item> </style>
Filipkowicz

0

window.setLayout ไม่เพียงพอสำหรับอุปกรณ์รุ่นเก่า

นี่คือสิ่งที่ฉันทำ:

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

วิธีแก้ปัญหาโดยใช้ตัวใหม่ConstraintLayoutคือการตัดConstraintLayouta LinearLayoutด้วย with minHeight และ minWidth ConstraintLayout จะไม่มีขนาดที่เหมาะสมสำหรับกล่องโต้ตอบ

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

ทำงานให้ฉันใน Kotlin

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

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

}

0

วิธีแก้ไขปัญหาต่อไปนี้ใช้ได้กับฉันโซลูชันอื่นให้พื้นที่ด้านข้างแก่ฉันเช่นไม่ใช่แบบเต็มหน้าจอ

คุณต้องทำการเปลี่ยนแปลงในวิธีการเริ่มต้นและ 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));
 }


   
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.