4

내가 내 응용 프로그램에서 탐색을 다음 설치하려고 탭으로 ViewPager 내부 조각과 ListFragment 교체 :

실제 조건 : ViewPager + 탭 목록 사이에 슬쩍하기 :

  • ListFragment
  • ListFragment의 B

원하는 조건 : ViewPager + 탭 :

,
  • ListFragment A는 DetailFragment B 목적은 탭 탐색 내부 상세 단편을 표시하는

으로 ListFragment B 대체 DetailFragment

  • ListFragment B onListItemSelected으로 ListFragment 대체 onListItemSelected. fragmentList를 detailFragment로 대체 할 수 없습니다 (fragmentList에는 사용자 정의 레이아웃이 없으므로 ID가 없으며이를 수행하는 방법을 모릅니다). 또한 새 작업을 시작하면 탭 표시 줄가 숨겨집니다.

    누군가 나를 도울 수 있습니까?

  • 답변

    14

    표시 할 내용 (목록 또는 세부 정보)을 알고있는 래퍼 조각을 만들 것입니다. 이것은 ViewPager에서 완벽하게 분리 될 것입니다. 호출기는 래퍼 조각을 보유하고 있음을 알 수 있으며, 이는 내용 자체를 관리합니다.

    구현이 라인을 따라 다음과 같습니다

    public class WrapperFragment extends Fragment { 
    
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
    
         MyListFragment list = new MyListFragment(); 
         list.setListAdapter(adapter); 
         list.setOnItemClickListener(new OnItemClickListener() { 
          @Override public void onItemClick(AdapterView<?> l, View v, int position, long id) { 
           // Create details fragment based on clicked item's position 
           Fragment details = new Fragment(); 
           getChildFragmentManager() 
            .beginTransaction() 
            .replace(R.id.container, details) 
            .addToBackStack(null) 
            .commit(); 
          } 
         }); 
    
         getChildFragmentManager() 
          .beginTransaction() 
          .add(R.id.container, list) 
          .commit(); 
        } 
    
        @Override 
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
         // There has to be a view with id `container` inside `wrapper.xml` 
         return inflater.inflate(R.layout.wrapper, container, false); 
        } 
    
        public class MyListFragment extends ListFragment { 
    
         private OnItemClickListener listener; 
    
         public void setOnItemClickListener(OnItemClickListener l) { 
          this.listener = l; 
         } 
    
         @Override 
         public void onListItemClick(ListView l, View v, int position, long id) { 
          if(listener != null) { 
           listener.onItemClick(l, v, position, id); 
          } 
         } 
        } 
    } 
    

    wrapper.xml. 아이디어는 WrapperFragment이 id가 container 인보기를 포함하는 레이아웃을 제공해야한다는 것입니다.이 ID를 가진보기를 사용하여 하위 조각 -또는 DetailsFragment을 삽입했기 때문입니다.

    <?xml version="1.0" encoding="utf-8"?> 
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"> 
    
        <FrameLayout 
         android:id="@+id/container" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent"/> 
    
    </FrameLayout> 
    

    또 다른 방법. (오히려 ID container와 아이를하는 것보다 레이아웃이 id 자체가)이 작동해야하지만 당신은 밖으로 시도해야합니다 :

    <?xml version="1.0" encoding="utf-8"?> 
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/container" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"/> 
    
    +0

    레이아웃 래퍼는 다음과 같이겠습니까? onCreateView에 대한 InflateException이 발생합니다. <조각 xmlns : android = "http://schemas.android.com/apk/res/android" android : id = "@ + id/container" android : name = "PATH_TO_WrapperFragment" ...> –

    +1

    'wrapper.xml'에 대한 예제가 추가되었습니다. 이 문제가있는 경우 알려 주시기 바랍니다. – mindeh

    +0

    감사합니다. 정상적으로 작동하는 것 같습니다. –