ProgressBar Android में दिखाई देने के दौरान उपयोगकर्ता सहभागिता को कैसे अक्षम करें?


80

मैं एक कस्टम प्रोग्रेसबार का उपयोग कर रहा हूं। अब जबकि एक कार्य चल रहा है, मैं प्रगति बार दिखा रहा हूं, लेकिन उपयोगकर्ता अभी भी विचारों और नियंत्रणों के साथ बातचीत कर सकता है। मैं संपूर्ण दृश्य पर उपयोगकर्ता सहभागिता को कैसे अक्षम करता हूं, जैसे कि ProgressDialog करता है, जब यह दिखाई देता है।

क्या मुझे मुख्य दृश्य के शीर्ष पर एक पारदर्शी दृश्य का उपयोग करने और उस दृश्य पर प्रगति पट्टी दिखाने की आवश्यकता है और कार्य पूरा होने के बाद उस दृश्य को छिपाएं।

या बस मेरे पेरेंटव्यू की आईडी प्राप्त करें और इसे अक्षम करें? लेकिन तब मैं बैकग्राउंड को डिम नहीं कर पाऊंगा, ठीक वैसे ही जब डायलॉग / एक्टिविटी / फ्रैगमेन्ट पर कोई डायलॉग दिखाई देता है तो क्या होता है। सही?

मैं केवल किसी भी इंटरैक्शन से उपयोगकर्ता को हटाने का तरीका जानना चाहता हूं जबकि प्रगतिबार दिखाई देता है।

धन्यवाद



4
@txteclipse मैं प्रगति बार को अनुकूलित नहीं करना चाहता, मैंने पहले ही ऐसा कर लिया है। इसलिए, मेरा प्रश्न डुप्लिकेट नहीं है। मैं केवल प्रगति को दिखाई देने के दौरान उपयोगकर्ता इंटरैक्शन को अक्षम करना चाहता हूं, उसी तरह जब एक ProgressDialog दिखाई देता है उपयोगकर्ता प्रगति डायलॉग को खारिज किए बिना अन्य UI नियंत्रणों से बातचीत नहीं कर सकता है। अब मेरा प्रश्न उस प्रश्न का डुप्लिकेट कैसे है? मेरा सवाल कस्टमाइज़ेशन से भी दूर का नहीं है।
intellignt_idiot

1
यदि आप किसी संवाद की सभी कार्यशीलता चाहते हैं, तो आपको एक संवाद का उपयोग करना चाहिए। मॉडरेशन लागू करने के लिए गैर-तुच्छ है: स्वीकृत उत्तर कीबोर्ड इंटरेक्शन को ब्लॉक नहीं करता है, उदाहरण के लिए। लिंक किए गए प्रश्न का दूसरा उत्तर दर्शाता है कि कैसे ProgressDialog के साथ कस्टम प्रोग्रेसबार संसाधनों का उपयोग किया जाए। यदि वह आपकी आवश्यकताओं को पूरा नहीं करता है, तो आप अपने ProgressBar के साथ एक कस्टम लेआउट का उपयोग कर सकते हैं ।
ग्राफ थ्योरी

जवाबों:


147

आपका प्रश्न: ProgressBar Android में दिखाई देने के दौरान उपयोगकर्ता सहभागिता को कैसे अक्षम करें?

उपयोगकर्ता इंटरैक्शन को अक्षम करने के लिए आपको बस निम्नलिखित कोड जोड़ना होगा

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

उपयोगकर्ता इंटरैक्शन वापस पाने के लिए आपको बस निम्नलिखित कोड जोड़ना होगा

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

यहाँ एक उदाहरण दिया गया है: ध्यान दें: मैं आपको केवल एक उदाहरण दे रहा हूँ ताकि यह दिखाया जा सके कि उपयोगकर्ता सहभागिता को कैसे निष्क्रिय या बरकरार रखा जा सकता है

अपने xml में प्रगति पट्टी जोड़ें। इस तरह से आगे बढ़ें

<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/progressBar"
    android:visibility="gone"/>

MainActivity में जब एक बटन दबाया जाता है तो आप प्रोग्रेसबार दिखाते हैं और उपयोगकर्ता इंटरैक्शन को अक्षम करते हैं।

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mImageView = (ImageView) findViewById(R.id.imageView);
    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
    mImageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mProgressBar.setVisibility(View.VISIBLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        }
    });
}

और जब उपयोगकर्ता बैकप्रेस्ड होता है तो आप प्रोग्रेसबार को हटा देते हैं फिर से उपयोगकर्ता इंटरैक्शन को बनाए रखते हैं। इस तरह से

  @Override
public void onBackPressed() {
    super.onBackPressed();
    mProgressBar.setVisibility(View.GONE);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}

यदि आप डिसएबल और ग्रेयर्ड आउट डिस्प्ले की सुविधा जोड़ना चाहते हैं, तो आपको अपने xml लेआउट फ़ाइल में एक रैखिक लेआउट जोड़ना होगा जो कि माता-पिता को भरता है। इसकी पृष्ठभूमि # B0000000 पर सेट करें और इसके visibiltyलिए GONE। फिर प्रोग्रामेटिकली इसे सेट visibilityकरें VISIBLE

उममीद है कि इससे मदद मिलेगी!


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

13

मैंने इस मुद्दे को रूट लेआउट को जोड़कर तय किया है ProgressBar

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:clickable="true"
    android:gravity="center"
    android:visibility="gone"
    android:id="@+id/progress">
    <ProgressBar
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:indeterminate="true"
        android:indeterminateTintMode="src_atop"
        android:indeterminateTint="@color/primary"/>
</LinearLayout>

रूट लेआउट को क्लिक करने योग्य बनाया

android:clickable="true"

नोट: मेरे मुख्य विचार में, मैं RelativeLayoutरूट के रूप में था और अंतिम स्थिति (अंतिम बच्चा) में रूट लेआउट के अंदर उपरोक्त कोड जोड़ा है।

उम्मीद है की यह मदद करेगा!!


मैं FrameLayoutइसके बजाय एक के बजाय LinearLayoutअन्य सुझाव देना चाहूंगा , यह उत्तर एकदम सही है और यह सिर्फ काम करता है। थैंक्स निवार
लुकास पी।

क्या यह तब काम करता है जब पृष्ठभूमि दृश्य में बटन होते हैं? जब तक आप इस रूट लेआउट में एक उच्च ऊंचाई निर्धारित नहीं करते हैं, तब तक उन लोगों की ऊंचाई अधिक होती है (एपीआई 21+ कम से कम) और वे क्लिक करने योग्य होंगे।
Ixx


3

दस्तावेज़ डिफ़ॉल्ट विधि का उपयोग करें progressbar.setCancelable (झूठा)


1
लेकिन उपयोगकर्ता की बातचीत पर इसका क्या प्रभाव पड़ेगा? मैं अभी भी EditText में टच या टाइप कर सकता हूं जबकि ProgressBar दिखाई दे रहा है और गलत के लिए रद्द करने योग्य है।
intellignt_idiot

6
और जब से एक प्रगति पट्टी सेट करने योग्य (झूठी) संपत्ति होने लगी है?
intellignt_idiot

जब आपके कार्य को आपके माता-पिता के दृश्य के रूप में सेट करने योग्य असत्य चल रहा हो, और कार्य पूरा होने के बाद सेट किया गया विकल्प सही हो
रमेश संभू

3

पारदर्शी पृष्ठभूमि के साथ एक संवाद बनाएं। इसके साथ मुद्दा getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);यह है कि ऐप कब बैकग्राउंड में आएगा और वापस आएगा यूजर यूआई कंपोनेंट्स के साथ इंटरेक्ट कर सकेगा, और भी बहुत कुछ। यूआई को अवरुद्ध करने के लिए एक पारदर्शी संवाद बनाएं और यदि आप छिपाने / दिखाने के लिए समय निर्धारित करना चाहते हैं। इसे एक रनवेबल धागे में करें। तो समाधान होगा

public class TransparentDialogHelper {

    private Dialog overlayDialog;

    @Inject
    public TransparentDialogHelper() {

    }

    public void showDialog(Context context) {
        if (AcmaUtility.isContextFinishing(context)) {
            return;
        }
        if (overlayDialog == null) {
            overlayDialog = new Dialog(context, android.R.style.Theme_Panel);
            overlayDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED);
        }
        overlayDialog.show();
    }

    public void hideDialog() {
        if (overlayDialog == null || AcmaUtility.isContextFinishing(overlayDialog.getContext())) {
            return;
        }
        overlayDialog.cancel();
    }
}

-------- Timer

Handler handler = new Handler();
handler.postDelayed( () -> {
    view.hideProgress();
}, 2000);

उत्कृष्ट समाधान, प्रक्रिया पर स्पष्ट नियंत्रण रखता है। अरे हाँ, और यह भी, के रूप में अच्छी तरह से woks। UPVOTED :)
टोनी गिल

1

अपने मूल लेआउट को संबंधित लेआउट के रूप में बनाएं और इसे जोड़ें:

    <RelativeLayout ... >

    <other layout elements over which prog bar will appear>

<RelativeLayout android:id="@+id/rl_progress_bar"
                android:layout_width="match_parent" android:clickable="true"
                android:layout_height="match_parent" >
<ProgressBar android:id="@+id/pb"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerInParent="true"
             android:indeterminateOnly="true"
             style="@android:style/Widget.DeviceDefault.ProgressBar"
             android:theme="@style/AppTheme.MyProgressBar"
    />
</RelativeLayout>

यदि आपके UI में फ़्लोटिंग बटन हैं, तो वे अभी भी सभी फ़ोकस को पकड़ लेते हैं और प्रगति बार दिखाई देने पर क्लिक करने योग्य रहते हैं। इस उपयोग के लिए: (जब आपका ठेला बार दिखाई दे और जब आप अपना ठेला बार को अदृश्य / चला दें तो उन्हें फिर से सक्षम करें)

fb.setEnabled(false);

1

स्वीकार किए गए उत्तर पर विस्तार (इरादा इरादा) करने के लिए :

जब आप कोटलिन का उपयोग करते हैं तो आप विस्तार कार्यों का उपयोग कर सकते हैं। इस तरह आपके पास UI को अवरुद्ध करने और अनब्लॉक करने के लिए एक त्वरित और अच्छा दिखने वाला तरीका है।

fun AppCompatActivity.blockInput() {
    window.setFlags(
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
}

fun AppCompatActivity.unblockInput() {
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
}

fun AppCompatActivity.blockInputForTask(task: () -> Unit) {
    blockInput()
    task.invoke()
    unblockInput()
}

आप अपनी गतिविधि में अवरुद्ध और अनब्लॉकिंग कार्यों का उपयोग कर सकते हैं। इसके अलावा, आप टोस्ट या कुछ और दिखाते हुए अधिक कार्यक्षमता जोड़ सकते हैं।

कस्टम दृश्य या किसी अन्य दृश्य में इसका उपयोग करते समय, आप बस संदर्भ को गतिविधि में डाल सकते हैं और कार्यों का उपयोग कर सकते हैं।

blockInputForTaskसरल रैखिक कार्यों को घेरने के लिए उपयोग करें blockInputऔरunblockInput जब वे अलग-अलग स्कोप में आवश्यक हों।

आप blockInputForTaskइस तरह का उपयोग कर सकते हैं :

blockInputForTask { 
    // Your lines of code
    // Can be multiple lines
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.