android - व्यूपेगर प्रारंभिक खंड से कार्य आइटम प्रदर्शित नहीं किए जा रहे हैं




4 Answers

आपको इसे पढ़ना चाहिए (xcolw द्वारा ...)

प्रयोग के माध्यम से ऐसा लगता है कि मूल कारण अमान्य है OptionsMenu कतारबद्ध नौकरियों को संसाधित करने के लिए मुख्य धागे पर ब्रेक के बिना एक से अधिक बुलाया जा रहा है। एक अनुमान - इससे कोई फर्क नहीं पड़ता कि मेन्यू सृजन का कुछ महत्वपूर्ण हिस्सा एक पोस्ट के माध्यम से स्थगित कर दिया गया था, जब तक कि यह खराब स्थिति में एक्शन बार को तब तक नहीं चला जाता जब तक वह चलता न हो।

ऐसे कुछ धब्बे हैं जो ऐसा हो सकते हैं जो स्पष्ट नहीं हैं:

  1. उसी आइटम के लिए viewPager.setCurrentItem कई बार कॉल करना

  2. गतिविधि के निर्माण पर ViewPager.setCurrentItem को कॉल करना। setCurrentItem एक विकल्प मेनू को अमान्य बनाता है, जिसे तुरंत गतिविधि के विकल्प मेनू के बाद अमान्य कर दिया जाता है

मैं प्रत्येक के लिए मिल गया कामकाज

  1. Pager.setCurrentItem देखने के लिए कॉल को सुरक्षित रखें

    if (viewPager.getCurrentItem() != position)
        viewPager.setCurrentItem(position);
    
  2. ऑनरेट मेंPager.setCurrentItem को देखने के लिए कॉल को डिफर करें

    public void onCreate(...) {
        ...
        view.post(new Runnable() {
            public void run() {
                // guarded viewPager.setCurrentItem
            }
        }
    }
    

इन परिवर्तनों के बाद व्यू पेजर के अंदर विकल्प मेनू अपेक्षित काम करता है। मुझे आशा है कि कोई इस में अधिक प्रकाश डाल सकता है।

स्रोत issue

आवेदन में मैं विकास कर रहा हूं मैं एक व्यूपर के टुकड़ों के साथ उपयोग कर रहा हूं और प्रत्येक टुकड़ा ViewPager में अन्य सभी टुकड़ों से स्वतंत्र रूप से अपना मेनू बनाता है।

मुद्दा यह है कि कभी-कभी खंड जो व्यूपार्जर द्वारा डिफ़ॉल्ट रूप से प्रारंभ किए जाते हैं (यानी इसकी प्रारंभिक स्थिति में) उनके आइटम एक्शन आइटम मेनू में पॉप्युलेट नहीं होते हैं। इससे भी बदतर यह है कि यह मुद्दा केवल अंतःक्रियात्मक रूप से होता है। अगर मैं व्यूपेजर के माध्यम से पर्याप्त स्वाइप करता हूं ताकि टुकड़ों को फिर से शुरू करने के लिए मजबूर किया जा सके, जब मैं वापस स्वाइप करता हूं, तो मेनू सही ढंग से पॉप्युलेट करता है।

गतिविधि कोड:

package net.solarnz.apps.fragmentsample;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v13.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;

public class FragmentSampleActivity extends Activity {
    private ViewPagerAdapter mViewPagerAdapter;
    private ViewPager mViewPager;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        if (mViewPagerAdapter == null) {
            mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager());
        }

        mViewPager = (ViewPager) findViewById(R.id.log_pager);
        mViewPager.setAdapter(mViewPagerAdapter);
        mViewPager.setCurrentItem(0);
    }


    private class ViewPagerAdapter extends FragmentStatePagerAdapter {
        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return 8;
        }

        @Override
        public Fragment getItem(int position) {
            Fragment f = Fragment1.newInstance(position);
            // f.setRetainInstance(true);
            f.setHasOptionsMenu(true);
            return f;
        }
    }
}

टुकड़ा कोड:

package net.solarnz.apps.fragmentsample;

import android.app.Fragment;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;

public class Fragment1 extends Fragment {
    int mNum;

    static Fragment newInstance(int num) {
        Fragment1 f = new Fragment1();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        mNum = getArguments() != null ? getArguments().getInt("num") : 0;
    }

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_list, menu);
    }

}

लेआउट:

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

    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

            <android.support.v4.view.ViewPager
                android:id="@+id/log_pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
</LinearLayout>

मेन्यू:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_refresh"
          android:title="Refresh"
          android:icon="@android:drawable/ic_delete"
          android:showAsAction="ifRoom|withText" />
</menu>

एक्शन मेनू पॉप्युलेट किया जा रहा है: http://i.stack.imgur.com/QFMDd.png

एक्शन मेनू पॉप्युलेट नहीं किया जा रहा है: http://i.stack.imgur.com/sH5Pp.png




मुझे भी एक ही समस्या थी। मेरे मामले में मेरे पास व्यूपार्जर के साथ एक गतिविधि है जिसमें दो टुकड़े होते हैं, प्रत्येक खंड अपने स्वयं के एक्शन मेनू को बढ़ाता है लेकिन खंड क्रिया मेनू नहीं दिखाया जाता है।

पेजर एडाप्टर कोड देखें

 public class ScreensAdapter extends FragmentPagerAdapter {

    public TrackerScreensAdapter(Context context, FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return 2;
    }

    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch (position){
            case 0:
                fragment = new Fragment1();
                break;
            case 1:
                fragment = new Fragment2();
                break;
        }
        return fragment;
    }

}

बनाने पर गतिविधि

    screensAdapter = new ScreensAdapter(this, getFragmentManager());
    viewPager.setAdapter(screensAdapter);

इस तरह मेरे व्यू पेजर के दो टुकड़े होते हैं, प्रत्येक टुकड़ा अपने स्वयं के कार्य को सक्रियता पर चलाता है, डेटा प्राप्त करता है और प्राप्त डेटा के आधार पर अपना लेआउट खींचता है। इसके अलावा प्रत्येक टुकड़े पर क्रेटऑप्शनमेनू है

  @Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);
    MyTask task = new MyTask();
    task.setTaskListener(this);
    task.execute();


}

 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fragment_menu, menu);
}

इस समस्या को हल करने के लिए कई बार खर्च करें और पता लगाएं कि खंड मेनू क्यों नहीं दिखाता है। मुझे जो चाहिए वह सब है

    screenAdapter = new ScreenAdapter(this, getFragmentManager());
    viewPager.post(new Runnable() {
        public void run() {
            viewPager.setAdapter(screenAdapter);
        }
    });



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

@Override
public void onResume() {
    mPagerAdapter.notifyDataSetChanged();
}



मेरे मामले में मैंने इस मुद्दे के मूल कारण का पता लगाया है जो मुझे विश्वास है कि FragmentStatePagerAdapter में एक बग है जो Fragment#setMenuVisibility को झूठ Fragment#setMenuVisibility रहा है और इसे ठीक होने पर विफल होने पर विफल रहता है जब यह इसके राज्य को पुनर्स्थापित करता है।

समाधान:

  1. FragmentStatePagerAdapter के बजाय FragmentPagerAdapter का उपयोग करें

  2. यदि आपको FragmentStatePagerAdapter का उपयोग करना चाहिए, तो अपने एडाप्टर उपclass में ओवरराइड सेट करें PrimaryItem ऐसा है:

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        super.setPrimaryItem(container, position, object);
    
        //This is a workaround for a bug in FragmentStatePagerAdapter
        Fragment currentItem = getItem(position);
        if (currentItem != null) {
            currentItem.setMenuVisibility(true);
            currentItem.setUserVisibleHint(true);
        }
    }
    



Related

android android-fragments android-actionbar android-viewpager