2012-12-14 15 views
11

से वापस जाने पर खंड में व्यूअरगर को दिखाया नहीं गया है (पुनर्स्थापित) मुझे निम्न समस्या का सामना करना पड़ रहा है: मुख्य स्क्रीन में, मेरे पास 3 बटन हैं: कॉन्फ़िगर, मुख्य, सेटिंग।अन्य खंड

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

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

Main fragment- fragment 1 in viewpager is shown Main fragment - fragment 2 in viewpager is shown Config fragment Setting fragment Go back to main fragment from config/setting fragment

शायद मैं गलत जब प्रक्रिया config से वापस जा रहा/मुख्य टुकड़ा करने के लिए टुकड़ा की स्थापना कर रहा हूँ। यदि मुख्य खंड केवल व्यूअर के बिना एक निश्चित लेआउट को बढ़ाता है, तो समस्या नहीं होगी। कॉन्फ़िगरेशन/सेटिंग खंड से मुख्य खंड पर वापस जाने पर व्यूअरजर की स्थिति को पुनर्स्थापित कैसे करें? मैं अपना कोड संलग्न कर रहा हूं ताकि आप मुझे और अधिक स्पष्ट उत्तर दे सकें। किसी भी उत्तर के लिए बहुत बहुत धन्यवाद।

package com.example.testfragmentviewpager; 

import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.FrameLayout; 

import com.example.viewpageindicator.CirclePageIndicator; 
import com.example.viewpageindicator.PageIndicator; 

public class MainActivity extends FragmentActivity { 

    Fragment configFragment; 
    Fragment settingFragment; 
    Fragment mainItemsFragment; 
    FrameLayout frmLayout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

     setContentView(R.layout.main); 

     if (savedInstanceState == null) { 
      FragmentManager fm = getSupportFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 
      frmLayout = (FrameLayout) findViewById(R.id.frame_cotainer); 
      mainItemsFragment = new MainItemsFragment(); 
      ft.add(R.id.frame_cotainer, mainItemsFragment, "mainItems").commit(); 
     } 

     addListener(R.id.btnConfig); 
     addListener(R.id.btnMain); 
     addListener(R.id.btnSetting); 

    } 

    public void addListener(int buttonID) { 
     final Button btn = (Button) findViewById(buttonID); 
     btn.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       showFragment(btn); 
      } 
     }); 
    } 

    public void showFragment(View v) { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     switch (v.getId()) { 
      case R.id.btnConfig: 
       if (configFragment == null) { 
        configFragment = new ConfigListFragment(); 
       } 
       else if (configFragment.isVisible()) 
        return; 
       if (getCurrentEntriesInBackStack() == 0) { 
        ft.addToBackStack("mainItems"); 
       } 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       ft.replace(R.id.frame_cotainer, configFragment, "config"); 

       break; 
      case R.id.btnMain: 
       if (mainItemsFragment == null) 
        mainItemsFragment = new MainItemsFragment(); 
       if (getCurrentEntriesInBackStack() == 0) 
        return; 
       else { 
        if (configFragment != null && configFragment.isVisible()) { 
         ft.detach(configFragment); 
         configFragment = null; 
        } 
        if (settingFragment != null && settingFragment.isVisible()) { 
         ft.detach(settingFragment); 
         settingFragment = null; 
        } 
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        removeFromContainer(ft); 
        callPopBackStack(); 
        return; 
       } 
      case R.id.btnSetting: 
       if (settingFragment == null) 
        settingFragment = new SettingFragment(); 
       else if (settingFragment.isVisible()) 
        return; 
       if (getCurrentEntriesInBackStack() == 0) { 
        ft.addToBackStack("mainItems"); 
       } 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       ft.replace(R.id.frame_cotainer, settingFragment, "setting"); 
       break; 
      default: 
       break; 
     } 

     ft.commit(); 
    } 

    private int getCurrentEntriesInBackStack() { 
     FragmentManager fm = getSupportFragmentManager(); 
     return fm.getBackStackEntryCount(); 
    } 

    private boolean callPopBackStack() { 
     FragmentManager fm = getSupportFragmentManager(); 

     boolean result = fm.popBackStackImmediate(); 
     return result; 
    } 

    private void removeFromContainer(FragmentTransaction ft) { 
     if (configFragment != null && configFragment.isVisible()) { 
      ft.detach(configFragment); 
      configFragment = null; 
     } 
     if (settingFragment != null && settingFragment.isVisible()) { 
      ft.detach(settingFragment); 
      settingFragment = null; 
     } 
     ft.commit(); 
    } 

    public static class ConfigListFragment extends Fragment { 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View v = inflater.inflate(R.layout.layout_config, container, false); 
      return v; 
     } 
    } 

    public static class SettingFragment extends Fragment { 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View v = inflater.inflate(R.layout.layout_setting, container, false); 
      return v; 
     } 

    } 

    public static class MainItemsFragment extends Fragment { 

     private MyPagerAdapter adapter; 
     private ViewPager viewpager; 
     private PageIndicator mIndicator; 
     View rootView; 

     private class setAdapterTask extends AsyncTask<Void, Void, Void> { 
      protected Void doInBackground(Void... params) { 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       viewpager.setAdapter(adapter); 
       mIndicator = (CirclePageIndicator) rootView.findViewById(R.id.indicator); 
       mIndicator.setViewPager(viewpager); 

       viewpager.setCurrentItem(0); 

      } 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      rootView = inflater.inflate(R.layout.mainscreen_layout, container, false); 

      adapter = new MyPagerAdapter(getFragmentManager()); 
      viewpager = (ViewPager) rootView.findViewById(R.id.myviewpager); 
      new setAdapterTask().execute(); 
      return rootView; 
     } 

    } 

    public static class MyPagerAdapter extends FragmentPagerAdapter { 

     public MyPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int index) { 
      if (index == 0) { 
       return new MainFragment1(); 
      } 
      else { 
       return new MainFragment2(); 
      } 
     } 

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

    @Override 
    public void onBackPressed() { 

     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     removeFromContainer(ft); 
     if (fm.popBackStackImmediate()) { 
      return; 
     } 

     else { 

      AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this); 
      dlg.setTitle("Confirm Exit"); 
      dlg.setMessage("Do you want to exit?").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        MainActivity.this.finish(); 
       } 

      }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 

      AlertDialog alertDlg = dlg.create(); 
      alertDlg.show(); 
     } 
    } 

} 

उत्तर

16

ऐसा लगता है कि आप टुकड़े एम्बेड करने के लिए पुराने हैक्स में से एक का उपयोग कर रहे हैं। मैं सुझाव दूंगा कि आप सबसे पहले नवीनतम एंड्रॉइड सपोर्ट लाइब्रेरी में अपग्रेड करें, यानी। रिलीज 11। फिर चाइल्ड फ्रैगमेंट मैनेजर http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager()

का उपयोग करने के तरीके पर एक नज़र डालें, मेरे पास एक दर्शक के साथ टुकड़ों को घोंसला करने के तरीके पर गितब पर एक उदाहरण है।

+3

आपके सुझाव के लिए धन्यवाद मार्को। मैंने अभी एंड्रॉइड सपोर्ट लाइब्रेरी को पुनः अपडेट किया है। 11 और getPildFragmentManager() को viewpager के निर्माता के पास पास करें लेकिन अभी भी कोई भाग्य नहीं है। जब मैं सेटिंग/कॉन्फ़िगर खंड से वापस जाता हूं, तो मुख्य टुकड़े में व्यूपर अभी भी खाली है। प्रक्रिया जब उपयोगकर्ता सेटिंग/कॉन्फ़िगर खंड से वापस जाते हैं, तो मैंने निम्नलिखित के रूप में कार्यान्वित किया है (फ़ंक्शन शो में विस्तार देखें, कंबल कोड का प्रारूप): 1/सेटिंग/कॉन्फ़िगरेशन खंड का यूआई अलग करें; 2/बैक स्टैक से मुख्य टुकड़ा प्राप्त करें क्या मैं बैक स्टैक से मुख्य टुकड़ा प्राप्त करने में गलत हूं? – zungnv

+0

यह मेरे लिए काम करता है, वोट करें :) –

+0

मेरे लिए काम किया! आपको धन्यवाद! – NemesisDoom