2016-03-20 12 views
0

Ich habe eine Aktivität, die Daten in der Datenbank in einer Ansicht Pager in Fragmenten organisiert anzeigen.Fragment in Sichtpager fatalen Fehler beim Neustart der Aktivität generieren

Wenn der Adapter init View Pager, ein Verfahren in jedem Fragment nennen es die ID des Datenbankeintrag retrive und Show weitergeben müssen:

bekommen es
 public Fragment getItem(int position) { 
     switch (position) { 
      case 0: // Fragment # 0 - This will show FirstFragment different title 
       firstFragment = Fragment.newInstance(1, "Page # 1"); 
       firstFragment.setID(ctx, id); 
       return firstFragment; 
      case 1: // Fragment # 0 - This will show FirstFragment different title 
       secondFragment = Fragment.newInstance(1, "Page # 2"); 
       secondFragment.setID(ctx, id); 
       return secondFragment; 
      case 2: // Fragment # 0 - This will show FirstFragment 
       thirdtFragment = Fragment.newInstance(1, "Page # 3"); 
       thirdtFragment.setID(context, id); 
       return thirdtFragment; 

      default: 
       return null; 
     } 
    } 

, wenn das Verfahren onCreateView des Fragments genannt retrive Daten aus der Datenbank und init alle Ansicht, die die Daten für den Benutzer:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 


    DataManager dataManager = new DataManager(mContext); 
    DataModel data = dataManager.getData(mID); 
    ..... 

alles scheint außer gut zu funktionieren, wenn der Benutzer die App neu starten, zum Beispiel war angehalten, wenn innerhalb dieser Aktivität: wenn die Aktivität neu gestartet wurde Ich bekomme einen fatalen Fehler ac Verarbeiten der Daten, als ob die private Variable (des Fragments), die die ID der Daten enthält, aus dem Garbage Collector gelöscht wurde.

Ist meine Vorgehensweise korrekt? Wie kann ich den Fehler verhindern, der beim Neustart der Aktivität generiert wird?

+0

Können Sie bitte den Logcat teilen? –

+0

Ich habe einen möglichen Ansatz für dieses Problem; Lass es mich als Antwort geben, damit du es versuchen kannst; – Eenvincible

Antwort

1

Während und onResume Fragment und Aktivität wird von android verwaltet, so dass Sie nicht die Elementvariablen abrufen kann, um dieses Problem zu überwinden auf dem Fragment des newInstance Methode Verwendung so etwas wie

public static Fragment newInstance(int id, String page){ 
    Bundle bundle = new Bundle(); 
    bundle.putString("page", page); 
    bundle.putInt("ID", page); 
    setArguments(bundle); 
} 

und auf Ihrer onCreateView Rückruf Verwendung etwas wie

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    int mID = getArguments().getInt("ID"); 
    DataManager dataManager = new DataManager(mContext); 
    DataModel data = dataManager.getData(mID); 
    ... 
0

So näherte ich mein Problem, indem Sie die folgenden Schritte aus:

  • Erstellen Sie einen Ansichtspager mit einer Liste von Fragmenten und ihren jeweiligen Titeln. Dieser Ansichtspageradapter sollte über eine Methode zum Hinzufügen von Fragmenten zur Liste verfügen. Hier ist mein Code:

    public class ViewPagerAdapter extends FragmentPagerAdapter { 
        private final List<Fragment> mFragmentList = new ArrayList<>(); 
        private final List<String> mFragmentTitleList = new ArrayList<>(); 
        private int mItemId; 
    
        public ViewPagerAdapter(FragmentManager manager, int id) { 
         super(manager); 
         mItemId = id; 
        } 
    
        @Override 
        public Fragment getItem(int position) { 
         return mFragmentList.get(position); 
        } 
    
        @Override 
        public int getCount() { 
         return mFragmentList.size(); 
        } 
    
        public void addFrag(Fragment fragment, String title) { 
         Bundle bundle = new Bundle(); 
         bundle.putInt("itemId", mItemId); 
         fragment.setArguments(bundle); 
         mFragmentList.add(fragment); 
         mFragmentTitleList.add(title); 
        } 
    
        @Override 
        public CharSequence getPageTitle(int position) { 
         return mFragmentTitleList.get(position); 
        }} 
    
  • nun in Ihrem Fragment, können Sie das Bündel Extra extrahieren, die Sie kann helfen, wenn einige Daten aus Ihrer Datenbank zum Beispiel zu lesen, wenn es sich um eine ID für Tabellenspalte ist. Ist dies Ihr Fragment Klasse sein könnte:

    public class InfoFragment extends Fragment { 
    
        private Activity mActivity; 
    
        private CustomerDbObject customer; 
        private int customerId; 
    
        public InfoFragment() { 
         // Required empty public constructor 
        } 
    
        @Override 
        public void onAttach(Context ctx){ 
         super.onAttach(ctx); 
    
         if (ctx instanceof Activity){ 
          this.mActivity = (Activity) ctx; 
         } 
    
         customerId = getArguments().getInt("itemId"); 
    
         Realm realm = Realm.getInstance(ctx); 
    
         RealmQuery<Customer> query = realm.where(Customer.class); 
    
         query = query.equalTo("account_id", customerId); 
    
         customer = query.findFirst(); 
        } 
    
        @Override 
        public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) { 
         View view = inflater.inflate(R.layout.customer_fragment_info, container, false); 
    
         ButterKnife.bind(this, view); 
    
         return view; 
        }} 
    
  • Mit diesen beiden Stücken an Ort und Stelle, was wir jetzt brauchen, ist unsere Tätigkeit, die viewpager mit Registerkarten angezeigt werden! Denken Sie daran, dass es innerhalb derselben Aktivität liegt, dass wir der Viewpager-Instanz die zusätzliche (itemId) bereitstellen, die dann vom viewpager an das Fragment in dieser Reihenfolge übergeben wird.

    public class CustomerActivity extends AppCompatActivity { 
    
        private int mSelectedCustomer = 5; //this value could be extracted for an intent that is passed from a Recyclerviewer etc 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_customer_details); 
         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
         setSupportActionBar(toolbar); 
    
         getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    
         final ViewPager mViewPager = (ViewPager) findViewById(R.id.viewPager); 
         setupViewPager(mViewPager); 
    
         TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
         tabLayout.setupWithViewPager(mViewPager); 
    
    
         tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
         @Override 
         public void onTabSelected(TabLayout.Tab tab) { 
    
          mViewPager.setCurrentItem(tab.getPosition()); 
         } 
    
         @Override 
         public void onTabUnselected(TabLayout.Tab tab) { 
    
         } 
    
         @Override 
         public void onTabReselected(TabLayout.Tab tab) { 
    
         } 
        }); 
    
        } 
    
        private void setupViewPager(ViewPager viewPager) { 
         ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), mSelectedCustomer); 
         adapter.addFrag(new InfoFragment(), getString(R.string.info_tab)); 
        } 
    
    } 
    

Jetzt, wo wir zusammen alle Stücke haben, die wichtige zusätzliche (Daten) um immer auf das Fragment durch die viewpager Adapter zur Verfügung, die sie von der Tätigkeit anschließend wird übergeben werden sollte.

Als ich das getestet habe, hat es funktioniert und ich hoffe es funktioniert auch für dich. Bitte lassen Sie mich wissen, wie es geht !!

Verwandte Themen