0

我目前開發了一個帶有片段和viewPager的小樣本應用程序。 viewPager顯示3頁。在每一頁我實例化一個相同類型的片段。該片段包含一個textView和一個按鈕。在按鈕上單擊我想用另一個替換當前片段。現在我的問題是,無論我按哪個按鈕,只有頁面1的片段被替換。我不知道我必須在我的pageAdapter類中做什麼,但我想它與使用相同的片段和佈局有關。我想我必須確保我的pageAdapter更新了正確的頁面,但我該如何實現?如何在viewPager中使用相同的片段?

爲了更好地理解爲什麼我想實現這個目標,我在類型菜單的3個節點內接收了一個json字符串,並且我想將它們中的每一個用作viewPager中的一個頁面。

有人可以告訴我一個這樣的行爲簡單而簡單的例子嗎?我認爲它是一個基本的方法,所以它不是那麼困難。

-------- ---------編輯

下面是代碼:

public class FragmentPagerSupport extends FragmentActivity { 
static final int NUM_ITEMS = 4; 
MyAdapter mAdapter; 
ViewPager mPager; 

@Override 
public void onBackPressed() { 
    FragmentManager fm = getFragmentManager(); 
    if (fm.getBackStackEntryCount() > 0) { 
     fm.popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

public MyAdapter getmAdapter() { 
    return mAdapter; 
} 

public ViewPager getmPager() { 
    return mPager; 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fragment_pager); 
    mAdapter = new MyAdapter(getFragmentManager(), this); 
    mPager = (ViewPager) findViewById(R.id.pager); 
    mPager.setOffscreenPageLimit(NUM_ITEMS + 2); 
    mPager.setAdapter(mAdapter); 

    Button button = (Button) findViewById(R.id.goto_first); 
    button.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mPager.setCurrentItem(0); 
     } 
    }); 

    button = (Button) findViewById(R.id.goto_last); 
    button.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mPager.setCurrentItem(NUM_ITEMS - 1); 
     } 
    }); 
} 
} 

MyAdapter:

public MyAdapter(FragmentManager fm, FragmentPagerSupport fragmentPagerSupport) { 
super(fm); 
this.fragmentPagerSupport = fragmentPagerSupport; 
} 

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

@Override 
public Fragment getItem(int position) { 
     Fragment newInstance = null; 
     switch (position) { 
     case 0: 
      newInstance = frag1.newInstance(position); 
      break; 
     case 1: 
      newInstance = frag1.newInstance(position); 
      break; 
     case 2: 
      newInstance = frag2.newInstance(position); 
      break; 
     case 3: 
      newInstance = frag2.newInstance(position); 
      break; 
     } 
     return newInstance; 
    } 

Frag1 & Frag2 & ListItemFrag:

public static class frag1 extends ListFragment { 
    int mNum; 
    static frag1 newInstance(int num) { 
     frag1 f = new frag1(); 
     Supply num input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 
     return f; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mNum = getArguments() != null ? getArguments().getInt("num") : 1; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_pager_list, container, false); 
     v.setId(mNum); 
     View tv = v.findViewById(R.id.text); 
     ((TextView) tv).setText("Fragment #" + mNum); 
     return v; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     String[] cheeses = { "Edamer", "Gauda", "Cheddar", "Mozarella", "Maasdamer" }; 
     setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, cheeses)); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Log.i("FragmentList", "Item clicked: " + id); 
     String itemName = (String) l.getItemAtPosition(position); 
     Fragment listItemFragment = ListItemFragment.newInstance(itemName); 
     FragmentTransaction trans = getActivity().getFragmentManager().beginTransaction(); 
     trans.replace(R.id.root, listItemFragment, listItemFragment.getClass().getName() + "_" + mNum); 
     trans.addToBackStack(itemName); 
     trans.commit(); 
    } 
} 

public static class frag2 extends ListFragment { 
    int mNum; 
    static frag2 newInstance(int num) { 
     frag2 f = new frag2(); 
     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 
     return f; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mNum = getArguments() != null ? getArguments().getInt("num") : 1; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_pager_list, container, false); 
     v.setId(mNum); 
     View tv = v.findViewById(R.id.text); 
     ((TextView) tv).setText("Fragment #" + mNum); 
     return v; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     String[] cheeses = { "Edamer", "Gauda", "Cheddar", "Mozarella", "Maasdamer" }; 
     setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, cheeses)); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Log.i("FragmentList", "Item clicked: " + id); 
     String itemName = (String) l.getItemAtPosition(position); 
     Fragment listItemFragment = ListItemFragment.newInstance(itemName); 
     FragmentTransaction trans = getActivity().getFragmentManager().beginTransaction(); 
     trans.replace(R.id.root, listItemFragment, listItemFragment.getClass().getName() + "_" + mNum); 
     trans.addToBackStack(itemName); 
     trans.commit(); 
    } 
} 

public static class ListItemFragment extends Fragment { 
    String itemName; 
    static ListItemFragment newInstance(String itemName) { 
     ListItemFragment i = new ListItemFragment(); 
     Bundle args = new Bundle(); 
     args.putString("text", itemName); 
     i.setArguments(args); 
     return i; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     itemName = getArguments() != null ? getArguments().getString("text") : "NULL"; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_item, container, false); 
     View tv = v.findViewById(R.id.textView1); 
     ((TextView) tv).setText("Cheese: " + itemName + " selected!"); 
     return v; 
    } 
} 

尋呼機佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:padding="4dip" 
    android:gravity="center_horizontal" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 
<android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="0px" 
     android:layout_weight="1"> 
</android.support.v4.view.ViewPager> 
<LinearLayout android:orientation="horizontal" 
     android:gravity="center" android:measureWithLargestChild="true" 
     android:layout_width="match_parent" android:layout_height="wrap_content" 
     android:layout_weight="0"> 
    <Button 
     android:id="@+id/goto_first" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="first" /> 
    <Button android:id="@+id/goto_last" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="last"> 
    </Button> 
</LinearLayout> 

Frag1佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#99EE11" 
android:id="@+id/test"> 
<TextView android:id="@+id/text" 
    android:layout_width="match_parent" android:layout_height="wrap_content" 
    android:gravity="center_vertical|center_horizontal" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="@string/hello_world"/> 
<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dip" 
    android:layout_weight="1" 
    android:id="@+id/root" > 
    <ListView android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:drawSelectorOnTop="false"/> 
</FrameLayout> 

Frag2佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#99EE11" 
android:id="@+id/test2"> 
<TextView android:id="@+id/text" 
    android:layout_width="match_parent" android:layout_height="wrap_content" 
    android:gravity="center_vertical|center_horizontal" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="@string/hello_world"/> 
<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dip" 
    android:layout_weight="1" 
    android:id="@+id/root2" > 
    <ListView android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:drawSelectorOnTop="false"/> 
</FrameLayout> 

ListItemFrag佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/ll" 
android:layout_width="fill_parent" 
android:layout_height="match_parent" 
android:layout_alignParentLeft="true" 
android:layout_alignParentTop="true" 
android:layout_marginTop="230dp" 
android:background="#AA33EE" 
android:orientation="vertical" > 
<TextView 
    android:id="@+id/textView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 
</LinearLayout> 
+0

http://developer.android.com/intl/ru/training/animation/screen-slide.html –

+0

http://www.androidhive.info/2013/10/android-tab-layout-with- swipeable-views-1/ – ASP

+0

如果你可以在這裏發佈你的代碼,這將有所幫助。 – arco444

回答

2

您好我面臨同類問題。我用

getChildFragmentManager().beginTransaction() 

,而不是

getActivity().getSupportFragmentManager().beginTransaction() 

由於在這種情況下,我們正試圖從一個片段(一個內使交易出其連接到ViewPager片段列表的固定問題,因此持有ViewPager的Activity),所以我們必須在這裏使用getChildFragmentManager()來獲得所需的結果。

注意:我正在使用android支持v4庫和相應的FragmentManager。