0

콘텐츠 뷰가 조각 인 액티비티가 있는데이 액티비티에 뷰 페이지 및 뷰 페이지 표시기를 추가했습니다. 호출기에 대한 FragmentPagerAdapter를 만들었습니다. 어댑터는 세 개의 탭을 표시하기 위해 세 조각을 만듭니다. 그러나 프로젝트를 실행할 때 호출기 제목 만 표시됩니다. 왜 세 조각이 나옵니까?ViewPagerIndicator와 함께 조각이 표시되지 않는 이유

활동 라이프 사이클을 생성 할 때 호출기와 표시기를 만들었습니다.

public class BrowserActivity extends SherlockFragmentActivity 
         implements ReposFragment.OnFileSelectedListener, StarredFragment.OnStarredFileSelectedListener, OnBackStackChangedListener { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.seadroid_main); 
    adapter = new SeafileTabsAdapter(getSupportFragmentManager()); 

    pager = (ViewPager) findViewById(R.id.pager); 
    pager.setAdapter(adapter); 

    TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator); 
    indicator.setViewPager(pager); 
    indicator.setOnPageChangeListener(new OnPageChangeListener() { 
     @Override 
     public void onPageSelected(final int position) { 
      currentPosition = position; 
      supportInvalidateOptionsMenu(); 
      disableUpButton(); 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
      // TODO Auto-generated method stub 
     } 
    }); 

어댑터는 세 개의 탭 레이아웃 파일 seadroid_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/fragment_container" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 
<com.viewpagerindicator.TabPageIndicator 
    android:id="@+id/indicator" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    /> 
<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    /> 


UPDATE

class SeafileTabsAdapter extends FragmentPagerAdapter implements IconPagerAdapter { public SeafileTabsAdapter(FragmentManager fm) { super(fm); } private ReposFragment reposFragment = null; private ActivitiesFragment activitieFragment = null; private StarredFragment starredFragment = null; @Override public Fragment getItem(int position) { switch (position) { case 0: if (reposFragment == null) { reposFragment = new ReposFragment(); } return reposFragment; case 1: if (starredFragment == null) { starredFragment = new StarredFragment(); } return starredFragment; case 2: if (activitieFragment == null) { activitieFragment = new ActivitiesFragment(); } return activitieFragment; default: return new Fragment(); } } @Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return getString(R.string.tabs_library).toUpperCase(); case 1: return getString(R.string.tabs_starred).toUpperCase(); case 2: return getString(R.string.tabs_activity).toUpperCase(); default: return null; } } @Override public int getIconResId(int index) { return ICONS[index]; } @Override public int getCount() { return ICONS.length; } } 

을 디스플레이하기위한 세 개의 단편을 구성

ViewPager 튜토리얼에서 LineaLayout을 루트 컨테이너로 사용한다는 사실을 발견했습니다. FragmentLayout을 LineaLayout으로 변경해야합니다. LineaLayout으로 변경하면 앱이 다운되고 로그가

12-02 07:01:13.636: E/AndroidRuntime(3807): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.seafile.seadroid2/com.seafile.seadroid2.ui.activity.BrowserActivity}: android.view.InflateException: Binary XML file line #21: Error inflating class LineaLayout 
12-02 07:01:13.636: E/AndroidRuntime(3807):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 

답변

0

XML의 루트보기를 LinearLayout으로 전환 해보세요. 지금 당신은 TabPageIndicator 위에 ViewPager를 배치하는 효과가있는 FrameLayout을 사용하고 있습니다. 또한 layout_height가 0이므로 조각을 보지 않을 것입니다. 나는 이것이 귀하의 문제라고 생각합니다. 분명히 LinearLayout을 사용하려고했습니다.

또한 SeafileTabsAdapter 클래스에주의하십시오. 지금은 FragmentPagerAdapter를 사용할 때 논리적으로 보였던 조각을 캐시하고 있습니다. 그러나 FragmentPagerAdapter는 조각도 캐시하므로이 방법으로 메모리 누수가 발생할 위험이 있습니다. 매번 조각을 자동 생성하지 않고 getItem을 직접 호출하려는 경우 먼저 findFragmentByTag를 호출하여 조각이 아직 있는지 확인할 수 있습니다. Android에서 태그에 사용하는 문자열은 소스 또는 SO 질문에서 찾을 수 있습니다. Replace Fragment inside a ViewPager

희망이 있습니다. 설명에서 당신은 조각 안에 ViewPager가 있다고 말했기 때문에 코드에 대해 조금 혼란 스럽지만 게시 된 코드는 활동 내 ViewPager를 표시하는 것으로 보입니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment_container" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <com.viewpagerindicator.TabPageIndicator 
     android:id="@+id/indicator" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     /> 
    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     /> 
</LinearLayout> 

귀하의 의견에 귀하의 우려가 답변되기를 바랍니다. Sherlock 코드가 FrameLayout을 루트 뷰로 기대한다는 것을 의미한다면 (사용하지는 않았지만 나를 놀라게 할 것입니다.), 위의 LinearLayout을 위의 FrameLayout의 자식으로두면됩니다 전에. 말이 돼?

+0

의견을 보내 주셔서 감사합니다.하지만 SherlockFragmentActivity를 사용했기 때문에 루트보기를 Linealayout으로 변경할 수는 없습니다. 위의 코드 세그먼트는 getSupportFragmentManager와 같은 SherlockFragmentActivity 메소드에 대한 세부 종속성을 표시하지 않았습니다. 전체 코드 [여기] (https://github.com/haiwen/seadroid/blob/master/src/com/seafile/seadroid2/ui/activity/BrowserActivity.java)를 볼 수 있습니다. –

+0

나는 당신이 나를 오해했다고 생각합니다. 나는 당신이 당신의 활동 수업을 바꾸기를 원하지 않는다. 나는 seadroid_main.xml 파일을 바꾸기를 바란다. 내 대답에 수정 된 XML을 추가했습니다 ... – Bruce

+0

지금은 의미를 이해하지만 여전히 Linealayout을 사용할 수 없어 앱이 다운됩니다. –

관련 문제