एक्शन बार के तहत प्रोग्रेसबार


79

प्रश्न सारांश: मैं क्रोम ऐप पर, जैसे ProgressBarअंदर कैसे एकीकृत कर सकता हूं ActionBar?

विवरण: क्रोम से इस स्क्रीनशॉट को देखें:

Android स्क्रीनशॉट के लिए क्रोम

मैं इस तरह से एक एक्शन बार बनाना चाहता हूं। एक्शन बार के तहत, एक प्रोग्रेसबार है जो पेज लोड के अनुसार भरता है। मैंने इस उदाहरण को कई ऐप्स से देखा है, जैसे कि Feedly, लेकिन मैं अपना खुद का कार्यान्वयन नहीं बना पाया। मैंने इसे बनाने के लिए Android के अपने API का उपयोग करने का प्रयास किया:

@Override
protected void onCreate(Bundle savedInstanceState) {
    //Request Permission to display the Progress Bar...
    this.requestWindowFeature(Window.FEATURE_PROGRESS);
            this.setWindowContentView(R.layout.activity_main)
    super.onCreate(savedInstanceState);

    this.setProgressBarIndeterminate(true);
}

लेकिन यह कोड केवल प्रगति पट्टी को एक्शन बार पर दिखाने का कारण बनता है , जैसे:

मेरा ऐप स्क्रीनशॉट

इसलिए, मैं अपने प्रोग्रेसबेर को क्रोम ऐप पर एक्शन बार के तहत कैसे प्रदर्शित कर सकता हूं?


इस उत्तर के संभावित डुप्लिकेट प्रश्न: stackoverflow.com/a/10755545/794088
petey

क्या आपने अभी तक समाधान पाया है?
एरिक

मेरी दादी के लिए स्क्रीनशॉट
IlyaEremin

जवाबों:


7

यह अब एक मूल व्यवहार है जिसे SwipeRefreshLayout का उपयोग करके प्राप्त किया जा सकता है ।

आप अपने स्क्रॉल किए गए दृश्य को एक के साथ लपेट सकते हैं SwipeRefreshLayoutऔर फिर आपको ऑनरफ्रेश घटनाओं को सुनने की आवश्यकता है :

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

    swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
    swipeLayout.setOnRefreshListener(this);
    swipeLayout.setColorScheme(android.R.color.holo_blue_bright, 
            android.R.color.holo_green_light, 
            android.R.color.holo_orange_light, 
            android.R.color.holo_red_light);
}


@Override public void onRefresh() {
    new Handler().postDelayed(new Runnable() {
        @Override public void run() {
            swipeLayout.setRefreshing(false);
        }
    }, 5000);
}

एक अच्छा और सरल ट्यूटोरियल इस ब्लॉग में पाया जा सकता है ।


56

मैं ऊपर दिए गए स्वीकृत उत्तर से पूरी तरह संतुष्ट नहीं था, इसलिए मैंने खुद कुछ अतिरिक्त शोध किया।

मुझे लगता है कि उन्होंने जिस चाल का इस्तेमाल किया है, वह यह है कि उन्होंने पदानुक्रम में शीर्ष दृश्य को पुनः प्राप्त किया DecorViewऔर बुलाया प्रगति पट्टी को वहां जोड़ा। इस तरह, प्रगति पट्टी एक्शन बार और सामग्री क्षेत्र दोनों पर प्रदर्शित होती है। ध्यान दें कि एसडी का उत्तर सामग्री क्षेत्र में प्रगति पट्टी को रखता है और वास्तविक सामग्री से 'चोरी' करता है, जिससे अप्रत्याशित परिणाम हो सकते हैं।

इस कार्यान्वयन के नमूना स्क्रीनशॉट :

प्रगति पट्टी

ProgressBarIndeterminate

कोड

बस इस कोड को onCreateकुछ गतिविधि की विधि में रखें और इसे काम करना चाहिए:

// create new ProgressBar and style it
final ProgressBar progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));
progressBar.setProgress(65);

// retrieve the top view of our application
final FrameLayout decorView = (FrameLayout) getWindow().getDecorView();
decorView.addView(progressBar);

// Here we try to position the ProgressBar to the correct position by looking
// at the position where content area starts. But during creating time, sizes 
// of the components are not set yet, so we have to wait until the components
// has been laid out
// Also note that doing progressBar.setY(136) will not work, because of different
// screen densities and different sizes of actionBar
ViewTreeObserver observer = progressBar.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        View contentView = decorView.findViewById(android.R.id.content);
        progressBar.setY(contentView.getY() - 10);

        ViewTreeObserver observer = progressBar.getViewTreeObserver();
        observer.removeOnGlobalLayoutListener(this);
    }
});

आप प्रगति को व्यापक या संकरा सेट करने के लिए लेआउटप्रेमम्स की ऊँचाई तर्क के साथ खेल सकते हैं, लेकिन आपको -10ऑफसेट को समायोजित करना पड़ सकता है ।

स्टाइल

दुर्भाग्य से, आप प्रगति बार की बदसूरत ग्रे पृष्ठभूमि देख सकते हैं। इसे हटाने के लिए, बस आईडी द्वारा पृष्ठभूमि की खोज करना और इसे छिपाने की कोशिश करना काम नहीं करता है। पृष्ठभूमि को हटाने के लिए, मुझे सिस्टम संस्करण के समान दोषपूर्ण बनाना होगा और पृष्ठभूमि आइटम को निकालना होगा।

TL; DR: फाइल बनाएं progress_horizontal_holo_no_background_light.xmlऔर इस ड्रॉबल को पेस्ट करें:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/secondaryProgress">
        <scale android:scaleWidth="100%"
               android:drawable="@drawable/progress_secondary_holo_light" />
    </item>

    <item android:id="@android:id/progress">
        <scale android:scaleWidth="100%"
               android:drawable="@drawable/progress_primary_holo_light" />
    </item>

</layer-list>

sdk/platforms/android-xx/data/res/drawable-xxx/अपनी परियोजना से उपयुक्त .png ड्राबेल कॉपी करें और फिर उस कोड में जो आप जोड़ सकते हैं:

progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progress_horizontal_holo_no_background_light));

अतिरिक्त: अनिश्चितकालीन प्रगति पट्टी

अनिश्चितकालीन प्रगति सलाखों के पूर्व किटकैट संस्करण बहुत बदसूरत और सुस्त हैं। आप नई चिकनी प्रगति डाउनलोड कर सकते हैं ButteryProgressBar। बस इसे Google पर खोजें (मैं कोई और लिंक पोस्ट नहीं कर सकता, क्योंकि मैं यहां नया हूं: [), अपने प्रोजेक्ट में क्लास जोड़ें और आप बस पिछले प्रोग्रेसबार को इस कोड से बदल सकते हैं और खस्ता अनिश्चितकालीन प्रगति बार कर सकते हैं:

final ButteryProgressBar progressBar = new ButteryProgressBar(this);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));

आपको इस कोड को सरल बनाने की भी आवश्यकता हो सकती है:

final TypedArray ta = c.obtainStyledAttributes(attrs, R.styleable.ButteryProgressBar);
try {
    mBarColor = ta.getColor(R.styleable.ButteryProgressBar_barColor,
            c.getResources().getColor(android.R.color.holo_blue_light));
    mSolidBarHeight = ta.getDimensionPixelSize(
            R.styleable.ButteryProgressBar_barHeight,
            Math.round(DEFAULT_BAR_HEIGHT_DP * mDensity));
    mSolidBarDetentWidth = ta.getDimensionPixelSize(
            R.styleable.ButteryProgressBar_detentWidth,
            Math.round(DEFAULT_DETENT_WIDTH_DP * mDensity));
} finally {
    ta.recycle();
}

इस कोड के लिए:

mBarColor = c.getResources().getColor(android.R.color.holo_blue_light);
mSolidBarHeight = Math.round(DEFAULT_BAR_HEIGHT_DP * mDensity);
mSolidBarDetentWidth = Math.round(DEFAULT_DETENT_WIDTH_DP * mDensity);

आशा है कि मैंने मदद की :)


विधि RemoveGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener) ViewTreeObserver प्रकार से हटा दिया गया है
जमे हुए Crayon

@ अर्जुनु। इसके बजाय हमें क्या उपयोग करना चाहिए>
पैट्रिक गीयर


मैंने अनिश्चित प्रगति पट्टी का परीक्षण किया है (ButteryProgressBar ) के साथActionBarActivity लेकिन यह काम नहीं करता है। मैं एक अनिश्चित प्रगति पट्टी के नीचे कैसे रख सकता हूं ActionBar/Toolbar? यह वह लेआउट है जो मैं उपयोग कर रहा हूं: stackoverflow.com/a/26440880/1480019
user1480019

2
@GerritHoekstra: यदि getSupportActionBar().getHeight()फ़ंक्शन काम करता है, तो आप लगभग वहाँ हैं। progressBar.setY()समारोह सेट स्थिति पट्टी सहित स्क्रीन के ऊपर, सापेक्ष स्थिति। तो आपको क्या करना है setY(supportActionBarHeight + Math.ceil(25 * context.getResources().getDisplayMetrics().density))। स्टेटस बार 25px हाई (mdpi) है और उच्च डेनिसिटी (hdpi / xhdpi / ...) के साथ तराजू है। इसे आज़माएं और मुझे बताएं कि क्या यह काम करता है।
एंटीमोनिट

25

निम्न में से प्रत्येक के शीर्ष (ActionBar) और एक getProgressBar()विधि के नीचे एक ProgressBar के लिए कक्षा से गतिविधियाँ बढ़ाएँ :

मूल वर्ग:

public abstract class ProgressActivity extends Activity {
    private ProgressBar mProgressBar;

    @Override
    public void setContentView(View view) {
        init().addView(view);
    }

    @Override
    public void setContentView(int layoutResID) {
        getLayoutInflater().inflate(layoutResID,init(),true);
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        init().addView(view,params);
    }

    private ViewGroup init(){
        super.setContentView(R.layout.progress);
        mProgressBar = (ProgressBar) findViewById(R.id.activity_bar);
        return (ViewGroup) findViewById(R.id.activity_frame);
    }

    protected ProgressBar getProgressBar(){
        return mProgressBar;
    }
}

लेआउट (प्रगति। 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">
<ProgressBar android:id="@+id/activity_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="-8dp"
    style="@android:style/Widget.DeviceDefault.ProgressBar.Horizontal"
    />
  <FrameLayout android:id="@+id/activity_frame"
      android:layout_width="match_parent"
      android:layout_height="fill_parent"
      />
</LinearLayout>

1
यह काम करता है ... अधिकांश भाग के लिए। प्रोग्रेसबार एक्शनबार से अलग दिखता है। मुझे android:layout_marginTop="-8dp""छाया" प्रभाव का अनुकरण करने के लिए प्रोग्रेसबार में जोड़ना पड़ा। लेकिन इस पद्धति के लिए, संभवतः इसे मुख्य लेआउट में जोड़ना अधिक कुशल है। अभी तक यह इरादा के अनुसार काम करता है। हैक के लिए धन्यवाद।
जुबेरोटारबेटो

@zubietaroberto हाँ, यदि आप इसे केवल एक गतिविधि के लिए उपयोग कर रहे हैं, तो आप इसे मुख्य लेआउट में जोड़ सकते हैं। यदि आप चाहते हैं कि इस सुविधा के लिए कई गतिविधियाँ हों, तो आप ऊपर दिखाए गए वर्ग का विस्तार कर सकते हैं।
एसडी

1
मेरे लिए इसका काम है, लेकिन टैब होस्ट के तहत प्रगति बार दिखाई देता है, तो मैं इसे टैबहोस्ट के ऊपर और एक्शन बार के तहत कैसे बना सकता हूं?
डेसीएक्स

4

मैंने इस धागे के साथ-साथ StackOverflow पर अन्य थ्रेड्स से कोड संकलित किया है और एक प्रोजेक्ट बनाया है जिसका उपयोग ButteryProgessbar को कार्यान्वित करने के साथ-साथ "ताज़ा करने के लिए नीचे खींच" किया जा सकता है। https://github.com/pauldmps/Gmail-like-Pull-Down-to-Refresh

अपने आवेदन में कोड का उपयोग करने के लिए स्वतंत्र महसूस करें।

आप लोगों का बड़ा धन्यवाद।


3

कृपया नीचे दिए गए कोड का उपयोग करें। प्रगति पट्टी में केवल एक डिफ़ॉल्ट शैली का उपयोग करेंstyle="?android:attr/progressBarStyleHorizontal"

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    <ProgressBar 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleHorizontal"
        android:indeterminate="true"

        />

</RelativeLayout>

0

ठीक है, मैंने अपने पालतू जानवरों में से एक के लिए कुछ ऐसा ही किया है और मुझे यकीन नहीं है कि ऐसा करने का एकमात्र तरीका या सबसे अच्छा तरीका है, लेकिन यह निश्चित रूप से काम करता है।

शुरू करने के लिए, एक ओवरले एक्शन बार का उपयोग करें और फिर बैकग्राउंड ड्रॉबल को "null" पर सेट करें ताकि ओवरले एक्शन बार पारदर्शी हो।

अब आप एक्टिविटी लेआउट में, अपने एक्शन व्यू के लिए टॉप मार्जिन को "एक्शनबार ऊंचाई" पर सेट करें। आप इसे इस तरह से कर सकते हैं।

<RelativeLayout
    ...
    android:layout_marginTop="?android:attr/actionBarSize" />

अब क्रिया आपकी किसी भी गतिविधि सामग्री को छिपाने वाली नहीं है।

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

अब आप आसानी से हेडर दृश्य में एक प्रगति पट्टी रख सकते हैं और इसे हेडर दृश्य के नीचे संरेखित कर सकते हैं। उपयोगकर्ता को ऐसा लगेगा जैसे कि प्रगति पट्टी क्रोम पट्टी की तरह ही एक्शन बार पर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.