2016-12-12 3 views
0

Ich erstelle eine Android App, die mehrere Fragmente hat, eines für jedes Feature. Ich verwende derzeit eine Schublade, um auf jede Funktion zuzugreifen, und in einer bestimmten Funktion verwende ich eine FragmentPagerAdapter bis switch between fragments within that fragment. Wenn ich zuerst die App öffne, um auf mein Fragment zuzugreifen, werden die in meiner layout.xml-Datei definierten Benutzeroberflächenelemente wie erwartet geladen. Wenn ich jedoch mit meiner Schublade zu einem anderen Fragment wechsle und zu meinem ursprünglichen Fragment zurückkehre, verschwinden die ursprünglichen UI-Elemente.Android Fragment UI-Elemente verschwinden beim Ändern von Fragmenten?

Drawer Code in Basisaktivität Schalt unterschiedliche Merkmals Fragmente zuzugreifen

public class BaseActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener, ValueEventListener { 
    FragmentManager fm; 
    ArrayList<String> listOfAvailableRooms=new ArrayList<>(); 
    String timing=""; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_base); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 

     // start of own code 
     fm = getSupportFragmentManager(); 
    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.base, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     return super.onOptionsItemSelected(item); 
    } 

    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     Fragment fragment; 

     int id = item.getItemId(); 

     if (id == R.id.f_map) { 
      fragment = new MapFragment(); 
     } else if (id == R.id.f_booking) { 
      fragment = new CalendarFragment(); 
     } else if (id == R.id.f_roomSearch) { 
      fragment = new RoomSearchFragment(); 
     } else if (id == R.id.f_authentication) { 
      fragment = new AuthenticationFragment(); 
     } else if (id == R.id.nav_send) { 
      fragment = new MapFragment().newInstance(3, new LatLng(-53.965623629921105, -5.974991060793399)); 
     } else { 
      fragment = new MapFragment(); 
     } 

     fm.beginTransaction().replace(R.id.main_container, fragment).commit(); 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

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

     @Override 
     public Fragment getItem(int position) { 
      if (position == 0) return new MapFragment(); 
      return new MapFragment(); 
     } 

     @Override 
     public int getCount() { 
      // Show 4 total pages. 
      return 4; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return "Client"; 
       case 1: 
        return "Server"; 
      } 
      return null; 
     } 
    } 
} 

Gesamt Fragment für Eigenschaft

public class AuthenticationFragment extends Fragment { 
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    FragmentPagerAdapter adapterViewPager; 

    private OnFragmentInteractionListener mListener; 

    public AuthenticationFragment() { 
     // Required empty public constructor 
    } 

    public static AuthenticationFragment newInstance(String param1, String param2) { 
     AuthenticationFragment fragment = new AuthenticationFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_authentication, container, false); 
     ViewPager vpPager = (ViewPager) view.findViewById(R.id.vpPager); 
     adapterViewPager = new MyPagerAdapter(getFragmentManager()); 
     vpPager.setAdapter(adapterViewPager); 
     return view; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
    } 

    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
      mListener.onFragmentInteraction(uri); 
     } 
    } 

    public interface OnFragmentInteractionListener { 
     // TODO: Update argument type and name 
     void onFragmentInteraction(Uri uri); 
    } 

    public static class MyPagerAdapter extends FragmentPagerAdapter { 
     private static int NUM_ITEMS = 2; 

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

     // Returns total number of pages 
     @Override 
     public int getCount() { 
      return NUM_ITEMS; 
     } 

     // Returns the fragment to display for that page 
     @Override 
     public Fragment getItem(int position){ 
      switch (position){ 
       case 0: //CurrentBookings Fragment 
        return CurrentBookings.getInstance("Current"); 
       case 1: //UpcomingBookings Fragment 
        return UpcomingBookings.newInstance("Upcoming"); 
       default: 
        return null; 
      } 
     } 

     // Returns page title for the top indicator 
     @Override 
     public CharSequence getPageTitle(int position){ 
      switch (position){ 
       case 0: //CurrentBookings Fragment 
        return "Current"; 
       case 1: //UpcomingBookings Fragment 
        return "Upcoming"; 
       default: 
        return null; 
      } 
     } 
    } 

} 

Fragment mit Disappearing UI-Elemente

public class CurrentBookings extends Fragment { 
    private Button myButton; 

    // newInstance constructer for creating fragment with arguments 
    public static CurrentBookings newInstance(String title){ 
     CurrentBookings currentBookings = new CurrentBookings(); 
     Bundle args = new Bundle(); 
     args.putString("title",title); 
     currentBookings.setArguments(args); 
     return currentBookings; 
    } 

    // Store instance variables based on arguments passed 
    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     title = getArguments().getString("title"); 
    } 

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

     myButton = (Button) view.findViewById(R.id.button1); 
     return view; 
    } 
} 

Screenshots von App beim ersten offenen Fragmente screenshot first open fragment

Screenshots von App wenn Fragmente erneuten Besuch enter image description here enter image description here

Das Oberflächenelement erscheint nur wieder, wenn das Telefon Orientierung ändert. Wie kann ich dieses Problem lösen?

+0

Wo ist der Schaltercode der Schublade? Bitte poste den Code. –

Antwort

0

Ja,

Sie müssen Ihr Kind Fragmente von AuthenticationFragment manuell entfernen.

Wenn Sie den Adapter zu dieser Zeit setzen, müssen Sie die beiden Fragmente in Arraylist in Ihrem parentFragment hinzufügen, so dass Sie die vollständige Liste des Fragments erhalten, so dass Sie die Fragmente auf ondestroyView() des Elternfragments leicht entfernen können.

private class AuthenticationFragment extends Fragment{ 

private Arraylist fragmentList = new ArrayList<>(); 


private void setAdapter(){ 
    fragmentList.add(new FirstFragment()); 
    fragmentList.add(new SecondFragment()); 
............. code of adapter 


} 



    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 

     final FragmentManager fragmentManager = getFragmentManager(); 
     final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     for (Fragment fragment : fragmentList) { 
      fragmentTransaction.remove(fragment); 
     } 
     fragmentTransaction.commit(); 

    } 

} 

Da Sie FragmentPagerAdapter in AuthenticationFragment verwendet haben.

+0

Kann ich klären, ob dies im Base Activity Code (mit der Schublade) oder im AuthenticationFragment Code hinzugefügt werden soll? –

+0

Ich habe meinen Code aktualisiert. Sie sollten die Fragmente in ArrayList hinzufügen, und mit dieser Arraylist sollten SieAdapter setzen, damit Sie das Fragment leicht entfernen können, sonst erhalten Sie NullPointerException. in Remove-Methode –

Verwandte Themen