स्क्रीन को भरने के लिए मुझे डायलॉग स्टाइल गतिविधि विंडो कैसे मिल सकती है?


142

मैं संवाद थीम सेट के साथ एक गतिविधि का उपयोग कर रहा हूं, और मैं चाहता हूं कि यह पूर्ण स्क्रीन हो। मैंने सभी प्रकार की चीजों की कोशिश की, यहां तक ​​कि खिड़की को पूरी तरह से चौड़ाई और ऊंचाई तक विस्तारित करने के लिए WindowManager के माध्यम से जा रहा है, लेकिन कुछ भी काम नहीं करता है।

जाहिर है, एक संवाद खिड़की (या संवाद विषय के साथ एक गतिविधि) केवल इसकी सामग्री के अनुसार विस्तार करेगी, लेकिन यहां तक ​​कि हमेशा काम नहीं करती है। उदाहरण के लिए, मैं एक प्रगति बार सर्कल दिखाता हूं जिसकी चौड़ाई और ऊंचाई FILL_PARENT पर सेट है (इसलिए इसका लेआउट कंटेनर है), लेकिन फिर भी, संवाद स्क्रीन को भरने के बजाय बहुत छोटी प्रगति पट्टी के चारों ओर घूमता है।

एक संवाद विंडो के अंदर कुछ छोटा प्रदर्शित करने का एक तरीका होना चाहिए लेकिन क्या इसकी सामग्री के आकार के बिना पूर्ण स्क्रीन आकार में विस्तार हुआ है?


2
दिलचस्प नोट: जब पिक्सेल में वास्तविक मूल्य के लिए लेआउट कंटेनर की चौड़ाई और ऊंचाई सेट करते हैं, तो संवाद तदनुसार बदलता है। लेकिन जब इसे FILL_PARENT पर सेट किया जाता है, तो यह नहीं होता ...
Matthias

वास्तव में? गतिविधि जिस लेआउट को त्वरित कर रही है, क्या उसके पास पेरेंट रिलेटिव या रेखीय लयआउट टैग है जो fill_parent की ऊंचाई और चौड़ाई पर सेट है? मैंने एक डायलॉग थीम के साथ कुछ गतिविधियों को लागू किया है और इसे पूरी स्क्रीन पर लेने में कभी कोई समस्या नहीं हुई।
मैट सीएफ

हां, गतिविधि में एक LinearLayout है जो कि चौड़ाई और ऊंचाई दोनों के लिए FILL_PARENT पर सेट है।
मथियास

मैं एक समाधान का उपयोग करके समस्या को हल करता हूं, लेकिन चूंकि यह एक अच्छा समाधान नहीं है, इसलिए मैं प्रश्न को खुला छोड़ दूंगा। मैंने जो किया था, वह रैखिकलेयूट को उप-वर्गित करने और इसकी ऑनमोर () पद्धति को ओवरराइड करने के लिए था, जो एक लेआउटिंग चक्र के दौरान दृश्य के आकार को निर्धारित करने के लिए ज़िम्मेदार है, और इसे स्क्रीन की चौड़ाई और ऊंचाई पर ठीक करना है। हालांकि यह सही नहीं है, क्योंकि यह मेनू बारों के कब्जे वाले स्थान को ध्यान में नहीं रखता है, इसलिए कंटेनर वास्तव में स्क्रीन पर दिखने की तुलना में अधिक लंबा होगा (सभी अजीब साइड इफेक्ट्स जैसे कि बच्चों के गैर दृश्य क्षेत्रों में गायब हो जाते हैं। स्क्रीन)।
Matthias

मुझे सही समाधान मिला, नीचे मेरा उत्तर देखें।
मथायस 17

जवाबों:


312

मुझे इसका हल मिला:

आपकी गतिविधि में जिसकी Theme.Dialogशैली सेट है, यह करें:

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

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

यह महत्वपूर्ण है कि आप कॉल करने के Window.setLayout() बाद कॉल करें setContentView(), अन्यथा यह काम नहीं करेगा।


5
धन्यवाद, मेरा समय बच गया, कहीं मुझे यह पता नहीं चला! लेकिन किसी भी विचार को क्यों हमें स्पष्ट रूप से कोड में निर्दिष्ट करना है, क्यों fill_parent विषय संवाद के साथ गतिविधियों के लिए xml के माध्यम से काम नहीं करता है?
बैठा

3
मेरा डायलॉग चौड़ाई नहीं भरेगा, एक्सएमएल द्वारा नहीं, और इस विधि से नहीं। मैं अपने नाखून खा रहा हूं।
ईटमा

6
और यह है:import android.view.ViewGroup.LayoutParams;

11
FILL_PARENT को अब हटा दिया गया है, इसके बजाय MATCH_PARENT का उपयोग करें
AlexV

4
यह पूरी स्क्रीन को नहीं भर रहा है, यह ऐसा है जैसे इसमें हर तरफ एक छोटा सा पैडिंग है।
मचादो

66

आप इस मान को अपनी शैली में जोड़ सकते हैं android: windowMinWidthMajor और android: windowMinWidthMinor

<style name="Theme_Dialog" parent="android:Theme.Holo.Dialog">
    ...
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
</style>

2
सबसे आसान उपाय। यह Appcompat सपोर्ट लाइब्रेरी के साथ भी काम कर रहा है। धन्यवाद।
मुहम्मद साकिब

इसका उत्तर स्वीकार किया जाना चाहिए। इसे करने का सबसे उचित और साफ तरीका। माता-पिता = "@ शैली / थीम का उपयोग करने पर विचार करें ।AppCompat.Light.Dialog"
किरिल कर्मज़ीन

ऐसा लगता है कि यह काम करना चाहिए, लेकिन यह मेरे लिए नहीं है। हम्म, मुझे आश्चर्य है कि क्यों। शायद 2014 से चीजें बदल गई हैं।
स्कॉट बिग्स

53

मैं केवल स्क्रीन का केवल 80% भरना चाहता हूं, जिसके लिए मैंने नीचे ऐसा किया

        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int screenWidth = (int) (metrics.widthPixels * 0.80);

        setContentView(R.layout.mylayout);

        getWindow().setLayout(screenWidth, LayoutParams.WRAP_CONTENT); //set below the setContentview

यह केवल तभी काम करता है जब मैं गेटविंडो () सेट करता हूं। सेटआउट ... लाइन के नीचे सेट करेंकंटव्यू (..)

धन्यवाद @ माथियास


11

अपने डायलॉग_custom_layout.xml को किसी अन्य लेआउट के बजाय RelativeLayout में लपेटें । मेरे लिए काम किया।


1
यहाँ, चौड़ाई और ऊंचाई पूरी तरह से गलत थे और यह पता नहीं लगा सके कि कैसे ठीक किया जाए। रूट लेआउट को एक RelativeLayout में परिवर्तित करने से मेरे मुद्दे भी ठीक हो गए!
शार्पमोबाइलकोड

8

संवाद के लिए यह किसी के लिए उपयोगी हो सकता है। मुझे स्क्रीन की पूरी चौड़ाई लेने के लिए एक संवाद चाहिए। बहुत खोजा लेकिन कुछ भी उपयोगी नहीं मिला। अंत में यह मेरे लिए काम किया:

mDialog.setContentView(R.layout.my_custom_dialog);
mDialog.getWindow().setBackgroundDrawable(null);

इसे जोड़ने के बाद, मेरा संवाद स्क्रीन की पूरी चौड़ाई में दिखाई देता है।


5

यह उत्तर उन लोगों के लिए वर्कअराउंड है जो "Theme.AppCompat.Dialog" या किसी अन्य "Theme.AppCompat.Dialog" का उपयोग करते हैं , जैसे "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.ayNight.Dialog", आदि। मुझे स्वयं AppCompat डायलॉग का उपयोग करना है क्योंकि मैं अपनी सभी गतिविधियों के लिए AppCompatActivity का उपयोग करता हूं। अगर हम स्वीकृत उत्तर का उपयोग करते हैं तो संवाद में हर तरफ (ऊपर, दाएं, नीचे और बाएं) पैडिंग की समस्या होगी।

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

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

अपनी गतिविधि की शैली पर, इन कोड को जोड़ें

<style name="DialogActivityTheme" parent="Theme.AppCompat.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@null</item>
</style>

जैसा कि आप देख सकते हैं, हमारे संवाद के लिए पैडिंग उत्पन्न करने वाली समस्या "एंड्रॉइड: विंडोबेकग्राउंड" है, इसलिए यहां मैं विंडो को शून्य करने के लिए पृष्ठभूमि बनाता हूं।


2

शीर्ष सबसे लेआउट में न्यूनतम चौड़ाई सेट करें।

android:minWidth="300dp"

उदाहरण के लिए:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="300dp">

<!-- Put remaining contents here -->

</LinearLayout>

2

माथियास का जवाब ज्यादातर सही है लेकिन यह अभी भी पूरी स्क्रीन को नहीं भर रहा है क्योंकि इसमें हर तरफ एक छोटा सा पैडिंग है (@Holmes द्वारा इंगित)। उनके कोड के अलावा, हम Theme.Dialog स्टाइल को बढ़ाकर इसे ठीक कर सकते हैं और इस तरह की कुछ विशेषताओं को जोड़ सकते हैं।

<style name="MyDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
</style>

फिर हम केवल विषय सेट के साथ गतिविधि की घोषणा करते हैं MyDialog:

<activity
    android:name=".FooActivity"
    android:theme="@style/MyDialog" />

1

यह मेरे जैसे किसी के लिए मददगार होगा। कस्टम संवाद शैली बनाएँ:

<style name="MyDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsFloating">false</item>
</style>

में AndroidManifest.xmlचाहता था गतिविधि के लिए फ़ाइल सेट विषय:

<activity
        android:name=".CustomDialog"
        ...
        android:theme="@style/MyDialog"/>

यह सब है, प्रोग्रामेटिकली तरीकों को कॉल करने की आवश्यकता नहीं है।


अभी भी हर तरफ (शीर्ष, दाएं, नीचे और बाएं) पर पैडिंग दिखाते हैं और अगर हमें स्टेटस बार भी दिखाने की जरूरत है, तो यह समाधान विफल हो जाएगा
HendraWD

यदि आप प्रत्येक पक्ष पर गद्दी रखते हैं, तो stackoverflow.com/a/39590004/3940133 की जाँच करें
HendraWD

0

आपकी मैनिफ़ेस्ट फ़ाइल में जहाँ हमारी गतिविधि परिभाषित है

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

बिना एक्शन बार

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.