0

내 앱의 글꼴이 activity이고 NavigationView이고 내비게이션 창 UI의 다른 항목이 fragment을 변경하여 변경되었습니다. 그러한 조각 중 하나에는 TabLayout이 구현되어 있습니다. 앱이 시작될 때 TabLayout과 함께 fragment이로드되고 정상적으로 작동하지만 navigation drawer에서 다른 항목으로 전환 한 다음 TabLayout 인 항목으로 돌아 오면 이제 탭을 스 와이프하면 표시기가 탭 사이에 끼어 들게됩니다. 한 탭의 내용도 표시되지 않습니다. 내가 한 실수가 무엇인지에 대한 단서가 없습니다. 나는TabLayout 표시기가 탭 사이에서 멈추고 내용이 사라짐

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="start"> 

    <include 
     layout="@layout/app_bar_start" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 
     app:headerLayout="@layout/nav_header_start" 
     app:menu="@menu/start_menu" /> 

</android.support.v4.widget.DrawerLayout> 

이 이것은이다 app_bar_start.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="com.optimilia.readaloud.Start"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay" 
     app:elevation="0dp"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/AppTheme.PopupOverlay"/> 

    </android.support.design.widget.AppBarLayout> 

    <FrameLayout 
     android:id="@+id/frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

</android.support.design.widget.CoordinatorLayout> 

코드입니다 이것은 NavigationView (activity_start.xml)을 가지는 활동

compile 'com.android.support:appcompat-v7:24.2.1' 
compile 'com.android.support:design:24.2.1' 
compile 'com.android.support:support-v4:24.2.1' 

을 사용하고 있습니다 TabLayout을 가지는 fragment (fragment_home.xml)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/activity_home" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context="com.optimilia.readaloud.HomeFragment"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/custom_tab_layout_height" 
      app:tabMode="fixed" 
      app:tabGravity="fill"/> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

</LinearLayout> 

내가 2 일 동안이 버그와 붙어하고 도움 아무것도 찾을 수 없습니다

public class HomeFragment extends Fragment { 

    private View currView; 
    private TabLayout tabLayout; 
    private ViewPager viewPager; 
    private int[] tabIcons = { 
      R.drawable.ic_start, 
      R.drawable.ic_recent, 
      R.drawable.ic_reading_list 
    }; 

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

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

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

     viewPager = (ViewPager) currView.findViewById(R.id.viewpager); 
     setupViewPager(viewPager); 

     tabLayout = (TabLayout) currView.findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(viewPager); 
     setupTabIcons(); 

     return currView; 
    } 

    private void setupViewPager(ViewPager viewPager) { 
     HomeFragment.ViewPagerAdapter adapter = new HomeFragment.ViewPagerAdapter(getFragmentManager()); 
     adapter.addFragment(new StartFragment(), "Start"); 
     adapter.addFragment(new RecentFragment(), "Recent"); 
     adapter.addFragment(new ReadingListFragment(), "Reading list"); 
     viewPager.setAdapter(adapter); 
    } 

    private void setupTabIcons() { 
     tabLayout.getTabAt(0).setIcon(tabIcons[0]); 
     tabLayout.getTabAt(1).setIcon(tabIcons[1]); 
     tabLayout.getTabAt(2).setIcon(tabIcons[2]); 
    } 

    class ViewPagerAdapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 

     public ViewPagerAdapter(FragmentManager manager) { 
      super(manager); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return mFragmentList.get(position); 
     } 

     @Override 
     public int getCount() { 
      return mFragmentList.size(); 
     } 

     public void addFragment(Fragment fragment, String title) { 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return mFragmentTitleList.get(position); 
     } 
    } 

} 

Start.java

public class Start extends AppCompatActivity { 

    private NavigationView navigationView; 
    private DrawerLayout drawer; 
    private Toolbar toolbar; 
    private Fragment homeFragment = null; 

    // index to identify current nav menu item 
    public static int navItemIndex = 0; 

    // tags used to attach the fragments 
    private static final String TAG_HOME = "Home"; 
    private static final String TAG_STORE = "Store"; 
    private static final String TAG_ABOUT = "About"; 
    private static final String TAG_SETTINGS = "Settings"; 
    private static final String TAG_HELP = "Help"; 

    public static String CURRENT_TAG = TAG_HOME; 

    // toolbar titles respected to selected nav menu item 
    private String[] activityTitles; 

    private Handler mHandler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_start); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     mHandler = new Handler(this.getMainLooper()); 

     drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     navigationView = (NavigationView) findViewById(R.id.nav_view); 

     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.addDrawerListener(toggle); 
     toggle.syncState(); 

     // load toolbar titles from string resources 
     activityTitles = getResources().getStringArray(R.array.nav_item_activity_titles); 

     // initializing navigation menu 
     setUpNavigationView(); 

     if (savedInstanceState == null) { 
      navItemIndex = 0; 
      CURRENT_TAG = TAG_HOME; 
      loadFragment(true); 
     } 
    } 

    private void loadFragment(boolean selectNavMenu) { 

     if (selectNavMenu) { 
      selectNavMenu(); 
     } 

     // set toolbar title 
     setToolbarTitle(); 

     // if user select the current navigation menu again, don't do anything 
     // just close the navigation drawer 
     if (getSupportFragmentManager().findFragmentByTag(CURRENT_TAG) != null) { 
      drawer.closeDrawers(); 
      return; 
     } 

     // Sometimes, when fragment has huge data, screen seems hanging 
     // when switching between navigation menus 
     // So using runnable, the fragment is loaded with cross fade effect 
     Runnable mPendingRunnable = new Runnable() { 
      @Override 
      public void run() { 
       // update the main content by replacing fragments 
       Fragment fragment = getFragment(); 
       FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
       fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
       fragmentTransaction.replace(R.id.frame, fragment, CURRENT_TAG); 
       fragmentTransaction.commit(); 
      } 
     }; 

     // If mPendingRunnable is not null, then add to the message queue 
     if (mPendingRunnable != null) { 
      mHandler.post(mPendingRunnable); 
     } 

     drawer.closeDrawers(); 
     invalidateOptionsMenu(); 
    } 

    private Fragment getFragment() { 
     switch (navItemIndex) { 
      case 0: 
       if (homeFragment == null) { 
        homeFragment = new HomeFragment(); 
       } 
       return homeFragment; 
      case 1: 
       SettingsFragment settingsFragment = new SettingsFragment(); 
       return settingsFragment; 
//   case 2: 
//    // movies fragment 
//    MoviesFragment moviesFragment = new MoviesFragment(); 
//    return moviesFragment; 
//   case 3: 
//    // notifications fragment 
//    NotificationsFragment notificationsFragment = new NotificationsFragment(); 
//    return notificationsFragment; 
// 
//   case 4: 
//    // settings fragment 
//    SettingsFragment settingsFragment = new SettingsFragment(); 
//    return settingsFragment; 
      default: 
       return new HomeFragment(); 
     } 
    } 

    private void setToolbarTitle() { 
     getSupportActionBar().setTitle(activityTitles[navItemIndex]); 
    } 

    private void selectNavMenu() { 
     try { 
      navigationView.getMenu().getItem(navItemIndex).setChecked(true); 
     } 
     catch (Exception ex){} 
    } 

    private void setUpNavigationView() { 
     navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 

      // This method will trigger on item Click of navigation menu 
      @Override 
      public boolean onNavigationItemSelected(MenuItem menuItem) { 

       //Check to see which item was being clicked and perform appropriate action 
       switch (menuItem.getItemId()) { 
        //Replacing the main content with ContentFragment Which is our Inbox View; 
        case R.id.nav_home: 
         navItemIndex = 0; 
         CURRENT_TAG = TAG_HOME; 
         break; 
        case R.id.nav_settings: 
         navItemIndex = 1; 
         CURRENT_TAG = TAG_SETTINGS; 
         break; 
        case R.id.nav_store: 
         navItemIndex = 2; 
         CURRENT_TAG = TAG_STORE; 
         break; 
        case R.id.nav_help: 
         navItemIndex = 3; 
         CURRENT_TAG = TAG_HELP; 
         break; 
        case R.id.nav_about: 
         navItemIndex = 4; 
         CURRENT_TAG = TAG_ABOUT; 
         break; 
        default: 
         navItemIndex = 0; 
       } 

       //Checking if the item is in checked state or not, if not make it in checked state 
       if (menuItem.isChecked()) { 
        menuItem.setChecked(false); 
       } else { 
        menuItem.setChecked(true); 
       } 
       menuItem.setChecked(true); 
       loadFragment(false); 
       return true; 
      } 
     }); 
    } 

    @Override 
    public void onBackPressed() { 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawers(); 
      return; 
     } 
     super.onBackPressed(); 
    } 
} 

HomeFragment.java. 모든 종류의 도움을 주시면 감사하겠습니다.

+0

비슷한 종류의 문제가 있었지만 많은 디버깅을했는데 작동하지 않는 것으로 보였습니다. 단편에 전혀 내용이 표시되지 않았지만 라이브러리가 업데이트되었을 때 자동으로 수정되었습니다. 그래서 나는 조각을 위해 최신 라이브러리를 사용하는 것이 좋습니다. 또한 프래그먼트를 역 추적하지 않는 경우 commit() 대신 commitNow()를 사용하십시오. 그것은 모든 단편과 중첩 된 단편에 가장 잘 작동하도록되어 있습니다. –

+0

@SamvidMistryI 라이브러리를 API 레벨 25로 업데이트했지만 여전히 동일한 문제에 직면 해 있습니다. –

답변

2

HomeFragment.java은 에 getFragmentManager()을 사용하고 있으며 이로 인해 문제가 발생했습니다. getChildFragmentManager()으로 전환하면 완벽하게 작동하기 시작했습니다.

+0

getChildFragmentManger()를 시도 할 때 내 앱이 멈췄다. –