2016-12-12 11 views
0

私は複数の断片を持つアンドロイドアプリを作成していますが、各機能ごとに1つずつです。私は現在、各機能にアクセスするために引き出しを使用しています。特定の機能では、FragmentPagerAdapterswitch between fragments within that fragmentを使用しています。私のフラグメントにアクセスするアプリケーションを最初に作成すると、私のlayout.xmlファイルで定義されたUI要素が期待通りに読み込まれます。しかし、引き出しを使用して別のフラグメントに切り替えて元のフラグメントに戻すと、元のUI要素が消えます。フラグメントを変更するとAndroid FragmentのUI要素が消えますか?

引き出し異なる機能断片にアクセスするために、ベース活性がコード

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; 
     } 
    } 
} 

消えるUI要素

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; 
    } 
} 
と機能

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; 
      } 
     } 
    } 

} 

フラグメントに対する総合フラグメントを切り替えます

アプリのときに最初のオープンフラグメントのスクリーンショット screenshot first open fragment

アプリケーションのスクリーンショットフラグメント enter image description here enter image description here

を再訪電話の向きの変更UI要素のみが再び表示されます。どうすればこの問題を解決できますか?

+0

引出しの切り替えコードはどこですか。コードを投稿してください。 –

答えて

0

はい、

AuthenticationFragmentの子フラグメントを手動で削除する必要があります。

アダプターを設定するときには、両方のフラグメントをarraylistにparentFragmentに追加する必要があるため、フラグメントの完全なリストを取得できるようにして、親フラグメントのonDestroyView()でフラグメントを簡単に削除できるようにします。

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(); 

    } 

} 

AuthenticationFragmentにFragmentPagerAdapterを使用しているためです。

+0

Base Activityコード(引き出し付き)またはAuthenticationFragmentコードにこれを追加するかどうかを明確にすることはできますか? –

+0

自分のコードを更新しました。 ArrayListにフラグメントを追加して、そのフラグメントを簡単に削除できるように、そのarraylistを使用してsetAdapterを作成する必要があります。そうしないと、NullPointerExceptionが発生します。削除メソッド –

関連する問題