3

ViewPager를 사용하여 세 개의 탭으로 단편을 가져 오려고합니다. 처음에는 FragmentMgr을 사용하여 Activity에서 프래그먼트를 인스턴스화하는 데 사용되었습니다. ViewPager를 사용하여이 탐색을 변환하면이 Fragment가 더 이상 표시되지 않습니다. 나는이 같은 조각을 시작할 때 표시됩니다ViewPager에 단편을 표시 할 때의 문제

MainActivity.java. LaunchPageAdapter가 LaunchListFragment를 호출

mViewPager = (ViewPager) findViewById(R.id.pager); 
mViewPager.setAdapter(new LaunchPageAdapter(getSupportFragmentManager(),LIST_TYPE)); 
mViewPager.setCurrentItem(0); 

을 : 예를 들면 다음과 같이

LaunchListFragment fragment = new LaunchListFragment(); 
fragment.newInstance(LIST_TYPE); 
getSupportFragmentManager().beginTransaction() 
       .add(R.id.item_detail_container, 
fragment).commit(); 

나는 ViewPager을 사용하도록 코드를 위의이 변화를 시도했다. 여기 LaunchPageAdapter.java

public class LaunchPageAdapter extends FragmentPagerAdapter { 
private static String select=""; 

    public LaunchPageAdapter(FragmentManager fm, String type) { 
     super(fm); 
     select=type; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return LaunchListFragment.newInstance(select); 
      case 1: 
       return AddTeamFragment.newInstance(); 

     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return 2; 
    } 

는 LaunchListFragment.java

public class LaunchListFragment extends ListFragment implements ActionBar.TabListener { 
public static String LIST_TYPE = "invalid"; 
GenericListData g_data[] = null; 


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

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

     setActionTabs(); 
     setList(); 
     return (result); 
    } 


    public static Fragment newInstance(String type) { 
    Fragment frag = new LaunchListFragment(); 
    Bundle args = new Bundle(); 
    LIST_TYPE=type; 
    args.putString(LIST_TYPE, type); 
    frag.setArguments(args); 
    return (frag); 
} 

이 MainActivity main.xml에 의해 사용되는 레이아웃이다

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools= "match_parent" 
android:layout_height="match_parent" 
android:layout_marginLeft="16dp" 
android:layout_marginRight="16dp" 
android:baselineAligned="false" 
android:divider="?android:attr/dividerHorizontal" 
android:orientation="horizontal" 
android:showDividers="middle" 
tools:context=".MainActivity" > 

<fragment 
    android:id="@+id/item_list" 
    android:name="com.teammanager.ItemListFragment" 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="1" 
    tools:layout="@android:layout/list_content" /> 

<FrameLayout 
    android:id="@+id/item_detail_container" 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="3" > 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" /> 
</FrameLayout> 

이다 fragment_laun

나는이 디버깅

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:orientation="vertical" > 

<ListView 
    android:id="@android:id/list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_weight="1" 
    android:drawSelectorOnTop="false" > 
</ListView> 

<TextView 
    android:id="@+id/itemName" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginBottom="5dp" 
    android:layout_marginTop="5dp" 
    android:gravity="center_vertical" 
    android:textColor="#000000" 
    android:textSize="22dp" 
    android:textStyle="bold" /> 
LaunchListFragment

에서 사용 ch_list.xml, 나는 그것이 바로 표시되지 않습니다,에서 onCreate과에서 onCreate보기라고, LaunchListFragment가 인스턴스화지고 볼 수 있습니다. :(

여기 사람이 내 ViewPager 구현 여기에 무엇을 놓치고 있다면 알려주세요?

업데이트 내가 Viewpager를 사용하지 않고 LaunchListFragment라고하면, 내가 먼저 콘텐츠보기를 설정

및 통과 할 수 나는이 V를 사용하도록 변경하면 내가 조각을 표시 할 FrameLayout이의 ID입니다 R.id.item_detail_container은. 이전

setContentView(R.layout.main.xml); 
LaunchListFragment fragment = new LaunchListFragment(); 
fragment.newInstance(LIST_TYPE); 
    getSupportFragmentManager().beginTransaction() 
       .add(R.id.item_detail_container,  
    fragment).commit(); 

을 main.xml에 참조하시기 바랍니다 iewPager, 표시 할 부분을 지시하는 위치가 확실하지 않습니다. 내 조각 onView에서 나는 fragment_launch_list를 팽창시키고보기를 반환하고 있습니다. 그러나 뷰 호출기는 조각보기를 설정할 위치를 어떻게 알 수 있습니까? id 호출기 안에 있습니까?

저는 절대 초보자입니다.이 모든 것이 순진한 질문이라면 사과드립니다.

건배.

+1

궁금한 점은 왜 정적 변수'select'입니까? – Geros

+0

이전에 다른 조각에서 값 선택을 설정하는 데 사용되는 것은 객체간에 데이터를 전달하는 게으른 방법입니다. – Geoplex

+0

한 조각에서 다른 조각으로 값을 전송하고 인터페이스를 사용하려는 경우 정적 변수를 사용하지 마십시오. 올바른 방법이 아닙니다 ..! –

답변

1

이 당신을 위해 유용

public class ViewPagerAdapter extends FragmentStatePagerAdapter { 
    private List<Fragment> fragments=null; 
    private FragmentManager fragmentManager=null; 
    public ViewPagerAdapter(FragmentManager fragmentManager,List<Fragment> fragments) { 
     super(fragmentManager); 
     this.fragments=fragments; 
     this.fragmentManager=fragmentManager; 
    } 
    @Override 
    public Fragment getItem(int position) { 
     fragmentManager.beginTransaction().commitAllowingStateLoss(); 
     return fragments.get(position); 
    } 
    @Override 
    public int getCount() { 
     return fragments.size(); 
    } 
    @Override 
    public void setPrimaryItem(ViewGroup container, int position, Object object) 
    { 
     super.setPrimaryItem(container,0,fragments.get(0)); 
    } 
    @Override 
    public void notifyDataSetChanged() 
    { 
     super.notifyDataSetChanged(); 
    } 
    @Override 
    public void destroyItem(ViewGroup collection, int position, Object view) { 
     fragmentManager.executePendingTransactions(); 
     fragmentManager.saveFragmentInstanceState(fragments.get(position)); 
    } 
    public void replaceItem(int position,Fragment fragment) 
    { 
     fragments.set(position, fragment); 
     this.notifyDataSetChanged(); 
    } 
} 

MainActivity.java

public class MainActivity extends FragmentActivity implements OnPageChangeListener,TabListener 
{ 
    private android.support.v4.view.ViewPager mViewPager=null; 
    private ViewPagerAdapter mPagerAdapter=null; 
    private ActionBar action=null; 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_layout); 
     initilizeViewPager(); 
     action=getActionBar(); 
       action.setDisplayShowHomeEnabled(false); 
       action.setDisplayShowTitleEnabled(false); 
       action.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    } 
     public void initilizeViewPager() 
    { 
       mViewPager=(android.support.v4.view.ViewPager)findViewById(R.id.viewPager); 
     List<Fragment> fragments = new Vector<Fragment>(); 
       fragments.add(LaunchListFragment.newInstance(select)); 
       fragments.add(AddTeamFragment.newInstance()); 
       fragments.add(thirdFragment.newInstance()); 
       viewPagerAdapter=new ViewPagerAdapter(); 
mViewPager.setAdapter(viewPagerAdapter(getSupportFragmentManager(),fragments)); 
       new setAdapterTask().execute(); 
     mViewPager.setOnPageChangeListener(this); 
    } 
    private class setAdapterTask extends AsyncTask<Void,Void,Void> 
    { 
     protected Void doInBackground(Void... params) 
     { 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result) 
     { 
      mViewPager.setAdapter(mPagerAdapter); 
      Tab first=action.newTab().setTag("first").setText("First").setTabListener(MainActivity.this); 
      Tab second=action.newTab().setTag("second").setText("Second").setTabListener(MainActivity.this); 
Tab third=action.newTab().setTag("third").setText("Third").setTabListener(MainActivity.this); 
      action.addTab(first); 
      action.addTab(second); 
        action.addTab(third); 
      } 
     } 
    } 
    public void onPageScrollStateChanged(int arg0) 
    {} 
    public void onPageScrolled(int arg0, float arg1, int arg2) 
    {} 
    public void onPageSelected(int position) 
    { 
     getActionBar().setSelectedNavigationItem(position); 
    } 
public void onTabReselected(Tab tab, FragmentTransaction ft) {} 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {} 
} 

main_layout.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="fill_parent" 
     android:layout_below="@android:id/tabs" 
     android:layout_height="fill_parent"/> 
</RelativeLayout> 
+0

해답을 가져 주셔서 감사합니다. 코드를 복사하고 지침에 따라 LaunchListFragment가 표시되지 않습니다. 내가 디버깅, 그것은 actionbar에 탭을 추가합니다 - 그 부분이 작동하고 올바른 값 등으로 목록을 채 웁니다. 단편 onView가 호출되어 아무 목록도 표시되지 않습니다. ViewPager의 공개 설정과 관련이 있다고 생각하십니까? – Geoplex

+0

모든 조각 설정 트랜잭션은 부모 (활동 또는 상위 단편처럼)에 채워 져야합니다. 내 활동에 대한 거래를 생각하기 때문에 모든보기 호출기 트랜잭션을 처리하고 활동 내부에 탭을 추가합니다. –

+0

주 레이아웃에 몇 가지 문제점이 있다는 것을 알아 냈습니다. 먼저 수정하십시오. –

2

질문 설명은 내가 방금 가진 문제에 완벽하게 적합합니다. 나는 그 질문이 오래되었다는 것을 압니다. 그러나 이것은 다른 사람들이 똑같이 직면하는 데 도움이 될 수 있습니다. @Geoplex는 LaunchPageAdapter 클래스의 코드를 표시하지 않았습니다. 그래서 이것이 그의 문제를 해결할 지 확신이 서지 않습니다. 하지만 나를 위해 일했습니다.

내 PagerAdapter에서 public boolean isViewFromObject(View view, Object object)을 재정의했습니다. 나는 그 방법을 제거하고 그것을 처리하기 위해 superClass를 허용했다. 그것은 내 기대되는 결과를주기 시작했다.

관련 문제