Vì đây là một câu hỏi rất thường gặp, tôi muốn dành thời gian và nỗ lực để giải thích ViewPager với nhiều Mảnh vỡ và Bố cục chi tiết. Bạn đi đây
ViewPager với nhiều tệp Fragment và Layout - Cách thực hiện
Sau đây là một ví dụ đầy đủ về cách triển khai ViewPager với các loại phân đoạn khác nhau và các tệp bố cục khác nhau.
Trong trường hợp này, tôi có 3 lớp Fragment và một tệp bố cục khác nhau cho mỗi lớp. Để giữ cho mọi thứ đơn giản, bố cục mảnh chỉ khác nhau về màu nền của chúng . Tất nhiên, bất kỳ tệp bố cục nào cũng có thể được sử dụng cho Fragment.
FirstFragment.java có bố cục nền màu cam , SecondFragment.java có bố cục nền màu xanh lá cây và ThirdFragment.java có bố cục nền màu đỏ . Hơn nữa, mỗi Fragment hiển thị một văn bản khác nhau, tùy thuộc vào nó thuộc lớp nào và nó thuộc trường hợp nào.
Ngoài ra, hãy lưu ý rằng tôi đang sử dụng Fragment của thư viện hỗ trợ:
android.support.v4.app.Fragment
MainActivity.java (Khởi tạo Viewpager và có bộ điều hợp cho nó như một lớp bên trong). Một lần nữa có một cái nhìn vào hàng nhập khẩu . Tôi đang sử dụng android.support.v4
gói.
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
}
private class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int pos) {
switch(pos) {
case 0: return FirstFragment.newInstance("FirstFragment, Instance 1");
case 1: return SecondFragment.newInstance("SecondFragment, Instance 1");
case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1");
case 3: return ThirdFragment.newInstance("ThirdFragment, Instance 2");
case 4: return ThirdFragment.newInstance("ThirdFragment, Instance 3");
default: return ThirdFragment.newInstance("ThirdFragment, Default");
}
}
@Override
public int getCount() {
return 5;
}
}
}
Activity_main.xml (Tệp MainActivitys .xml) - một tệp bố cục đơn giản, chỉ chứa ViewPager lấp đầy toàn màn hình.
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
Các lớp Fragment, FirstFragment.java
nhập android.support.v4.app.Fragment;
public class FirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.first_frag, container, false);
TextView tv = (TextView) v.findViewById(R.id.tvFragFirst);
tv.setText(getArguments().getString("msg"));
return v;
}
public static FirstFragment newInstance(String text) {
FirstFragment f = new FirstFragment();
Bundle b = new Bundle();
b.putString("msg", text);
f.setArguments(b);
return f;
}
}
First_frag.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_dark" >
<TextView
android:id="@+id/tvFragFirst"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textSize="26dp"
android:text="TextView" />
</RelativeLayout>
Thứ haiFragment.java
public class SecondFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.second_frag, container, false);
TextView tv = (TextView) v.findViewById(R.id.tvFragSecond);
tv.setText(getArguments().getString("msg"));
return v;
}
public static SecondFragment newInstance(String text) {
SecondFragment f = new SecondFragment();
Bundle b = new Bundle();
b.putString("msg", text);
f.setArguments(b);
return f;
}
}
second_frag.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_green_dark" >
<TextView
android:id="@+id/tvFragSecond"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textSize="26dp"
android:text="TextView" />
</RelativeLayout>
Thứ baFragment.java
public class ThirdFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.third_frag, container, false);
TextView tv = (TextView) v.findViewById(R.id.tvFragThird);
tv.setText(getArguments().getString("msg"));
return v;
}
public static ThirdFragment newInstance(String text) {
ThirdFragment f = new ThirdFragment();
Bundle b = new Bundle();
b.putString("msg", text);
f.setArguments(b);
return f;
}
}
third_frag.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_light" >
<TextView
android:id="@+id/tvFragThird"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textSize="26dp"
android:text="TextView" />
</RelativeLayout>
Kết quả cuối cùng là như sau:
Viewpager chứa 5 Fragment, Fragment 1 thuộc loại FirstFragment và hiển thị bố cục First_frag.xml, Fragment 2 thuộc loại SecondFragment và hiển thị second_frag.xml và Fragment 3-5 thuộc loại ThirdFragment và tất cả đều hiển thị third_frag.xml .
Ở trên, bạn có thể thấy 5 Đoạn giữa có thể được chuyển qua vuốt sang trái hoặc phải. Tất nhiên chỉ có một mảnh vỡ có thể được hiển thị cùng một lúc.
Cuối cùng nhưng không kém phần quan trọng:
Tôi khuyên bạn nên sử dụng một hàm tạo trống trong mỗi lớp Fragment của bạn.
Thay vì bàn giao các tham số tiềm năng thông qua hàm tạo, hãy sử dụng newInstance(...)
phương thức và Bundle
để bàn giao các tham số.
Cách này nếu tách rời và gắn lại trạng thái đối tượng có thể được lưu trữ thông qua các đối số. Giống như Bundles
gắn liền với Intents
.