কীভাবে ডায়ালগফ্রেগমেন্টের প্রস্থটি পূরণ করুন প্যারেন্টে


100

আমি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন নিয়ে কাজ করছি যেখানে আমি DialogFragmentডায়ালগটি প্রদর্শন করতে ব্যবহার করছি তবে এর প্রস্থ খুব কম। আমি কিভাবে এই প্রস্থটি fill_parentএটি করতে পারি?

public class AddNoteDialogFragment extends DialogFragment {

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        getDialog().setTitle(getString(R.string.app_name));
        View view = inflater.inflate(R.layout.fragment_add_note_dialog,
                container);

        return view;
    }


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

ফ্রেগমেন্ট_এডডি_নোট_ডায়ালগ.এক্সএমএল

<?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:background="@android:color/white"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <EditText
        android:id="@+id/addNoteEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="top"
        android:hint="@string/clock_enter_add_note"
        android:imeOptions="actionDone"
        android:inputType="textCapSentences|textMultiLine"
        android:lines="5" />

    <Button
        android:id="@+id/submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="@drawable/login_button"
        android:text="@string/submit_button"
        android:textColor="@android:color/white" />

</LinearLayout>


4
আসলে, RelativeLayout ব্যবহার করে ঠিক একই লেআউটটি খুব ভালভাবে প্রদর্শিত হচ্ছে। যদিও আমি এর ব্যাখ্যা দিচ্ছি না ...
ড্যান চাল্টিয়েল

উত্তর:


157

এই সমস্যাটি হ্যান্ডেল করার জন্য আমি এটি সমাধানটি বের করেছিলাম:

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

সম্পাদনা করুন:

onCrateViewস্ফীত দৃশ্যটি ফেরত দেওয়ার আগে আপনি খন্ডের পদ্ধতিতে নীচের কোডটি ব্যবহার করতে পারেন ।

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

4
আপনি কেবল কল করতে পারেনdialog.getWindow().setBackgroundDrawable(null);
এডওয়ার্ডা

যদি এটি বাতিল হয়ে যায়, এটি স্বচ্ছ হবে না ... কেবলমাত্র কালো, 4.0.4 এ
জোয়াও পোলো

17
আমার জন্য, যদি আমি getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);ডায়ালগফ্রেগমেন্টের onResume()পদ্ধতিটি রাখি তবে এটি কাজ করে । এটি onCreateView()পদ্ধতিতে কাজ করে না । আমি থেকে সামান্য উত্তর পরিবর্তিত dialogকরতে getDialog()
রক লি

4
setLayoutমধ্যে onStartপদ্ধতি ঠিকভাবে কাজ। ধন্যবাদ
উইনসুক

82

আপনি কীভাবে সতর্কতা ডায়ালগটি 90% স্ক্রিনের আকার পূরণ করতে পারেন তা থেকে এলভিসের উত্তরটি ব্যবহার করার চেষ্টা করেছেন ?

এটি নিম্নলিখিত:

dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

হালনাগাদ:

উপরে কোডটি ভিতরে যুক্ত করা উচিত onStart() পদ্ধতিরDialogFragment


4
আপনি কোন লেআউটপ্যারামগুলি আমদানি করেছেন?
ymerdrengene

4
@ ইউমারড্রেঞ্জিন আসলে খুব ভাল প্রশ্ন। ব্যবহার করে দেখুন WindowManager.LayoutParams.FILL_PARENT
এপিকপান্ডাফোরস

4
@ ইয়ামারড্রেনজিন যদিও প্রযুক্তিগতভাবে, তারা সকলেই এই মানটি উত্তরাধিকার সূত্রে পেয়েছেন ViewGroup.LayoutParams, সুতরাং এটি কোনওভাবেই পুরোপুরি সূক্ষ্মভাবে কাজ করে।
এপিকপান্ডাফোরস

4
এখানে উল্লিখিত হিসাবে stackoverflow.com/a/15279400/1641882 আমি এই কোডটি সরানোর পরামর্শ দেবonCreateDialog
han

4
আমদানি android.view.WindowManager;
কীর্তি

53

এটি আমার জন্য কাজ করা হয়

আপনার কাস্টম শৈলী তৈরি করুন:

   <style name="DialogStyle" parent="Base.Theme.AppCompat.Dialog">
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
   </style>

আপনার অন্যান্য কথোপকথনের সাথে মেলে সঠিক পিতামাতার ব্যবহারের চেষ্টা করতে পারেন। উদাহরণস্বরূপ parent="ThemeOverlay.AppCompat.Dialog"এবং তাই।

আপনার কথোপকথনে এই স্টাইলটি ব্যবহার করুন

public class MessageDialog extends DialogFragment {

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

// your code 
}

4
<আইটেমের নাম = "অ্যান্ড্রয়েড: উইন্ডোব্যাকগ্রাউন্ড"> @ নাল </ i>> সহ সুন্দর সমাধান।
ইভজেনি সিনিটস্কি

4
আপনার অন্যান্য কথোপকথনের সাথে মেলে সঠিক পিতামাতাকে ব্যবহার করার যত্ন নিন। আমার ক্ষেত্রে এটি থিম ওভারলে.অ্যাপকম্প্যাট.ডায়ালগ
কোয়েলেগ্রিম্যালসালেগ্রে

31

আমার জন্য, যখন আমি রিলেটিভলয়েট দ্বারা অনক্রিটভিউতে স্ফীত লেআউটটির লিনিয়ারলআউট পিতাকে প্রতিস্থাপন করেছি তখন এটি কাজ করেছিল। অন্য কোনও কোড পরিবর্তন প্রয়োজন।


6
সাধারণ, স্ট্যাক ওভারফ্লো সম্পর্কে সর্বদা সবচেয়ে জনপ্রিয় না হওয়া উত্তর আমার সমস্যা সমাধান করে। ধন্যবাদ
বুসু

4
আমি এই উত্তরটি খুব পছন্দ করেছি তবে কেন এটি কেবল আপেক্ষিক বিন্যাসের জন্য কাজ করে না?
প্রীতেক গুপ্ত

19
    <!-- A blank view to force the layout to be full-width -->
    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_gravity="fill_horizontal" />

আমার ডায়লগের বিন্যাসের শীর্ষে কৌশলটি করেছিলেন।


4
এটি আমার পক্ষে কাজ করে, এবং আমি পছন্দ করি যে কোডে অতিরিক্ত কিছু যোগ করার প্রয়োজন নেই, তবে আমি কেন ভাবছি তা ভাবছি ...
শেলা

অবিশ্বাস্যভাবে, এটিই আমার পক্ষে কাজ করেছিল। কাস্টম স্টাইল না।
ম্যাগনাস ডাব্লু

19
public class FullWidthDialogFragment extends AppCompatDialogFragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_AppCompat_Light_Dialog_Alert);
    }
}

এবং আপনি যদি আরও অনেক নমনীয়তা চান তবে অ্যাপকম্প্যাট_ডায়ালগ_আল্ট এবং কাস্টম বৈশিষ্ট্যগুলি প্রসারিত করতে পারে


12

অন্যান্য সমাধানের ভিত্তিতে, আমি নিজের তৈরি করেছি।

<style name="AppTheme.Dialog.Custom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowMinWidthMajor">100%</item>
    <item name="android:windowMinWidthMinor">100%</item>
</style>
abstract class BaseDialogFragment : DialogFragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.AppTheme_Dialog_Custom)
    }
}

11

আমার ক্ষেত্রে আমি নিম্নলিখিত পদ্ধতিটিও ব্যবহার করেছি:

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.dialog_height));
    }
}

তবে কিছু ললিপপ + ডিভাইস (যেমন নেক্সাস 9) এর ডায়ালগের বাম এবং ডান প্রান্ত এবং পর্দার প্রান্তগুলির মধ্যে এখনও ছোট ফাঁক রয়েছে।

এটি সুস্পষ্ট ছিল না তবে শেষ পর্যন্ত আমি বুঝতে পেরেছিলাম যে এটির সমস্ত ডিভাইস এবং প্ল্যাটফর্মের উইন্ডো ব্যাকগ্রাউন্ডে পুরো প্রস্থ তৈরি করতে নীচের মত স্টাইলস.এক্সএমএল এর ভিতরে নির্দিষ্ট করা উচিত :

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

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত! আমাকে অনেক সময় বাঁচিয়েছে! উইন্ডো ব্যাকগ্রাউন্ডটি কৌতুকটি করেছিল।
করণ

11

আমি এই স্পষ্ট করতে চাই। দুটি উপায়ই সঠিক, তবে বিভিন্ন ডায়ালগফ্রেগমেন্ট সহ

ব্যবহার 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);
}

মূলত আমার পুরো প্রস্থের প্রয়োজন ছিল এবং এটি কাজ করেছিল। ধন্যবাদ!
Sud007

4

পার্শ্ব প্রতিক্রিয়া ছাড়াই আমার জন্য কাজ করা আর একটি সমাধান হ'ল:

আপনার শ্রেণিতে ডায়ালগফ্রেগমেন্ট প্রসারিত:

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

    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}

আপনার শৈলীতে:

<style name="DialogStyle" parent="ThemeOverlay.AppCompat.Dialog.Alert"></style>

আপনি সরাসরি সতর্কতা থিমটি ব্যবহার করতে পারেনsetStyle()
সনি

4

এটি আমার পক্ষে নিখুঁতভাবে কাজ করে।

android:minWidth="300dp"

এর মাধ্যমে আপনি ডায়লগ ফ্র্যাগমেন্টের প্রস্থ দিতে পারেন।


2

আপনার ডায়ালগফ্রেগমেন্টের ভিতরে ব্যবহারকারী সতর্কতা ডায়ালগ.বিল্ডার। এটি onCreateDialogএই পদ্ধতিতে যুক্ত করুন । এবং onCreateViewকিছুই করতে।

public Dialog onCreateDialog(Bundle savedInstanceState)
{

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    View view = LayoutInflater.from(getContext()).inflate(R.layout.gf_confirm_order_timeout_dialog, null);
    final Bundle args = getArguments();
    String message = args.getString(GfConstant.EXTRA_DATA);
    TextView txtMessage = (TextView) view.findViewById(R.id.txt_message);
    txtMessage.setText(message);

    view.findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if (mListener != null)
            {
                mListener.onDialogConfirmOK();
            }
        }
    });
    builder.setView(view);
    Dialog dialog = builder.create();
    dialog.setCanceledOnTouchOutside(false);
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    return dialog;
}

2

আপনার স্টাইল.এক্সএমএল ফাইলে একটি কাস্টম শৈলী তৈরি করুন। এই কোডটি আপনার স্টাইল.এক্সএমএল ফাইলটিতে কেবল অনুলিপি করুন

<style name="CustomDialog" parent="@android:style/Theme.Holo.Light" >
    <item name="android:windowBackground">@null</item>
    <item name="android:windowIsFloating">true</item>
</style>

তারপরে আপনার ডায়ালগফ্রেগমেন্টের createDialog পদ্ধতিতে কোড দ্বারা ডায়ালগ অবজেক্ট তৈরি করুন

 dialog = new Dialog(getActivity(), R.style.CustomDialog);

এটি আমার পক্ষে কাজ করছে এবং আশা করি এটি আপনাকেও সহায়তা করবে


এটি আমার পক্ষে কাজ করার জন্য আমাকে শৈলীতে নিম্নলিখিতটি যুক্ত করতে হয়েছিল: <আইটেমের নাম = "অ্যান্ড্রয়েড: উইন্ডো মিনউইথথমজোর"> 100% </item> <আইটেমের নাম = "অ্যান্ড্রয়েড: উইন্ডোমিনউইথথিনমিনোর"> 100% </item>
আর্নআউট

2

আমি যখন এই সমস্যার মুখোমুখি হলাম তখন এভাবেই সমাধান করেছি। এটা চেষ্টা কর.

আপনার ডায়ালগফ্রেগমেন্টের অনিয়িটি ক্রিয়াটেডে, আপনার প্রয়োজন অনুসারে এই কোডটি যুক্ত করুন ....

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        myview=inflater.inflate(R.layout.fragment_insurance_detail, container, false);
        intitviews();
        return myview;
    }
    @Override
    public void onActivityCreated(Bundle arg0) {
        super.onActivityCreated(arg0);
        getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        getDialog().getWindow().setGravity(Gravity.CENTER);
    }

1

ডায়ালগফ্রেগমেন্টের অনক্রিটভিউ পদ্ধতিতে এটি ব্যবহার করুন

    Display display = getActivity().getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, **220**, getResources().getDisplayMetrics());
    getDialog().getWindow().setLayout(width,px);

220 হ'ল ডায়ালগ খণ্ডের উচ্চতা, এটি আপনার ইচ্ছামত পরিবর্তন করুন


1

আপনার বিন্যাসের মূলটিতে অ্যান্ড্রয়েড সেট করুন: মিনিট প্রস্থটি খুব বড় মানের যেমন

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="9999999dp">

   ...

</LinearLayout>

0

আমি উপরে তালিকাভুক্ত একাধিক উত্তর চেষ্টা করেছি; তারা আমার পক্ষে কাজ করেনি। এটিই আমার সমস্যার সমাধান:

ইন DialogFragment(), নীচের কোডগুলি যুক্ত করুন:

override fun onResume() {
    super.onResume()
    if (showsDialog) {
        val width = ViewGroup.LayoutParams.MATCH_PARENT
        val height = ViewGroup.LayoutParams.WRAP_CONTENT
        dialog?.window?.apply {
            setBackgroundDrawable(ColorDrawable(Color.WHITE))
            attributes.gravity = Gravity.BOTTOM
            setLayout(width, height)
        }
    }
}

0

বিকল্প 1. ক্রিয়াকলাপে অঙ্কিততে নিম্নলিখিত কোড যুক্ত করুন

 getDialog().getWindow()
         .setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

অথবা আপনি ডায়ালগের জন্য একটি কাস্টম স্টাইল তৈরি করতে পারেন

<style name="CustomDialog" parent="AppTheme" >
  <item name="android:windowNoTitle">true</item>
  <item name="android:windowFullscreen">true</item>
  <item name="android:windowIsFloating">true</item>
  <item name="android:windowCloseOnTouchOutside">true</item>
</style>
then use that style in dialog fragment
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialog);
}

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

SampleDialogFragment sampleDialogFragment = new SampleDialogFragment();
SampleDialogFragment.show(getActivity().getSupportFragmentManager(), "sometag");

অথবা আপনি নীচের কোডটি স্টাইলে চেষ্টা করুন আপনাকে সহায়তা করবে

<item name="android:windowBackground">@null</item>

সমাধান 2: ডায়ালগ। উইন্ডো.সেটলআউট

class TestDialog : DialogFragment() {

    override fun onStart() {
        super.onStart()

        dialog?.window?.setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)
    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.