0

내 응용 프로그램의 주요 활동에는 사용자 정의 ViewPager (비활성 슬쩍 동작) 및 FragmentPagerAdapter가있는 고정 탭 막대가 있습니다.조각에서 ViewPager로 제어되는 조각이 표시되지 않습니다.

이 탭 표시 줄은 세 가지 다른 조각에 액세스 할 수있게 해주 며 첫 번째 조각에서는 해당 조각과 관련된보기간에 스 와이프 할 수 있기를 원합니다.

처음에는 ViewFlipper를 사용하려고했지만 ViewPager와 동일한 제스처를 얻을 수 없어서 이제는 ViewPager를 구현하려고합니다.

ViewPager에 사용하는 코드는 this 페이지의 ViewPager에있는 AnimationsDemo 프로젝트에서 가져온 코드입니다. 비록 내가 당신이 버튼 프레스를 사용하여보기를 전환 할 수 있도록 낮은 막대를 제거하여 약간의 조정을 했어.

이 내 조각이 모습입니다 같은 :

import android.app.Fragment; 
import android.app.FragmentManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v13.app.FragmentStatePagerAdapter; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup;  

public class NewsFragment extends Fragment { 
    private static final int NUM_PAGES = 5; 
    private ViewPager mPager; 
    private PagerAdapter mPagerAdapter;  

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

     mPager = (ViewPager) rootView.findViewById(R.id.pager); 
     mPagerAdapter = new ScreenSlidePagerAdapter(getFragmentManager()); 
     new setAdapterTask().execute(); 

     return rootView; 
    } 

    private class setAdapterTask extends AsyncTask<Void,Void,Void>{ 
      protected Void doInBackground(Void... params) { 
       return null; 
      }  

      @Override 
      protected void onPostExecute(Void result) { 
         mPager.setAdapter(mPagerAdapter); 
      } 
    } 

    /** 
    * A simple pager adapter that represents 5 {@link ScreenSlidePageFragment} objects, in 
    * sequence. 
    */ 
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
     public ScreenSlidePagerAdapter(FragmentManager fm) { 
      super(fm); 
     }  

     @Override 
     public Fragment getItem(int position) { 
      return ScreenSlidePageFragment.create(position); 
     }  

     @Override 
     public int getCount() { 
      return NUM_PAGES; 
     } 
    }  
} 

그리고에 속하는 XML :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 
    <TextView 
     android:id="@+id/textviewscreenslide" 
     android:text="Screen slide fragment" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     /> 
    <android.support.v4.view.ViewPager 
     android:layout_below="@+id/textviewscreenslide" 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</RelativeLayout> 

I에 유래에 인해 this 후 여기에 AsyncTask를 사용하고 있습니다를, 나 때문에 때때로 탭 항목간에 신속하게 전환 할 때 오류가 발생합니다.

이 내가 표시 할 조각이 모습입니다 같은 :

import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView;  

public class ScreenSlidePageFragment extends Fragment { 
    public static final String ARG_PAGE = "page"; 
    private int mPageNumber;  

    public static ScreenSlidePageFragment create(int pageNumber) { 
     ScreenSlidePageFragment fragment = new ScreenSlidePageFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PAGE, pageNumber); 
     fragment.setArguments(args); 
     return fragment; 
    }  

    public ScreenSlidePageFragment() { 
    }  

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mPageNumber = getArguments().getInt(ARG_PAGE); 
    }  

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_screen_slide_page, container, false); 
     ((TextView) rootView.findViewById(android.R.id.text1)).setText(getString(R.string.title_template_step, mPageNumber + 1)); 
     return rootView; 
    }  

    public int getPageNumber() { 
     return mPageNumber; 
    } 
} 

그리고 그것과 함께가는 XML :

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <LinearLayout android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:padding="16dp"> 
     <TextView android:id="@android:id/text1" 
      style="?android:textAppearanceLarge" 
      android:textStyle="bold" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="16dp" /> 
     <TextView style="?android:textAppearanceMedium" 
      android:lineSpacingMultiplier="1.2" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/lorem_ipsum" /> 
    </LinearLayout> 
</ScrollView> 

을 그래서 프로그램에게 포함 된 조각을 실행할 때 ViewPager는 정상적으로 나타납니다. 상단의 텍스트 "화면 슬라이드 조각"을 볼 수 있으며 오류가 발생하지 않습니다. 실제로이 조각에서 ViewPager를 스 와이프 할 수도 있습니다. 오른쪽으로 스 와이프하면 첫 번째 조각에있는 파란색 표시기가 왼쪽에 표시되고 왼쪽으로 몇 번 스 와이프하면이 표시기가 오른쪽에 나타납니다. ViewPager가 실제로 존재하기 때문에 Fragments는 나타나지 않습니다.

중첩 된 ViewPager에 관한 this 프로젝트를 보았지만, API 레벨 17 이상이 필요합니다. 따라서 심지어 불가능할 수도 있습니다.

내 질문에, 이러한 조각 (4.0 이상 만 지원)을 표시하는 방법이 있습니까? 아니면 조각 /보기 (이 조각의 모든보기를 전환 할 수있는 또 다른 효율적인 방법입니다. 호출기는 레이아웃면에서 완전히 동일 할 것이고 차이점은 TextViews의 텍스트 일뿐입니다). 어쩌면 내가 완전히 놓친 동일한 문제를 정확히 설명하는 또 다른 스레드가있을 수 있습니다.

답변

1

쉽게 수정했습니다. this 프로젝트의 코드를 v4 지원 라이브러리와 함께 사용했습니다. 내가 작동하지 않는 이유는 프로젝트에 v13 지원 라이브러리가있어서 getChildFragmentManager()을 방해했기 때문입니다. v13을 사용했기 때문에 실제로 v13을 사용하지는 않았지만 그 기능은 인정되지 않았습니다.