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


Answers

सरल उत्तर ViewPager में टुकड़ों के भीतर मेनू का उपयोग नहीं करना है। यदि आपको टुकड़ों के भीतर मेनू का उपयोग करने की आवश्यकता है, तो मैं जो सुझाव देता हूं वह मेनू गतिविधि को पेरेंट गतिविधि में ऑन्रेटऑप्शनमेनू विधि के माध्यम से लोड कर रहा है। जाहिर है आपको यह निर्धारित करने में सक्षम होना होगा कि कौन सा मेनू दिखाना है।

मैं वर्ग प्रतिबिंब का उपयोग करके इसे प्राप्त करने में सक्षम था। प्रत्येक बार जब आप पेज स्विच करते हैं तो आपको अमान्य ऑप्शनमेनू विधि का उपयोग करने की भी आवश्यकता होगी। जब ViewPager पृष्ठों को बदलता है तो आपको इसे कॉल करने के लिए OnPageChangeListener की आवश्यकता होगी।

Question

आवेदन में मैं विकास कर रहा हूं मैं एक व्यूपर के टुकड़ों के साथ उपयोग कर रहा हूं और प्रत्येक टुकड़ा 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




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

शायद यह जानकारी किसी और की मदद कर सकती है।




वर्तमान खंड प्राप्त करने के लिए सबसे पहले FragmentPagerAdapter के उप वर्ग में एक विधि बनाएं

    public SherlockFragment getFragment() {
    return currentFragment;
}

        @Override
public void onTabSelected(final Tab tab, FragmentTransaction ft) {

    ((SherlockFragmentActivity) mContext).invalidateOptionsMenu();
    Fragment f = ((SherlockFragmentActivity) mContext)
            .getSupportFragmentManager().findFragmentByTag(
                    makeFragmentName(tab.getPosition()));

    currentFragment=(SherlockFragment) f;
 }

अब मुख्य अधिनियम में विधियों के नीचे ओवरराइड करें

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (mTabsAdapter.getPositionOfTabSelected() != 0) {
        menu.add("Read").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
        menu.add("Write").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
        menu.add("Clear").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
        menu.add("Factory data reset").setShowAsAction(
                MenuItem.SHOW_AS_ACTION_IF_ROOM);
    }

    return super.onCreateOptionsMenu(menu);
}

अब onOptionItem को गतिविधि से खंड में चुनने के लिए कॉल करें

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    mTabsAdapter.getFragment().onOptionsItemSelected(item);
    return super.onOptionsItemSelected(item);
}



Related