fragment与ViewPager一起使用实现上下滑与左右滑,碎片页面适配器
ViewPager可以左右滑还可以在页面里添加ListView实现上下滑,单击事件还不冲突:
下面的例子,ViewPager(分页视图)里面的页面都是fragment,使用的同一个布局,并且在布局中添加了ListView:
碎片之间的通讯见fragment详解
MainActivity.java:
import java.util.ArrayList; 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; /** *注意:这里要使用v4包下的Fragment,因为ViewPager为v4里的,并且需要为它添加fragment *PagerFragment也得是v4包下的 */ public class MainActivity extends FragmentActivity { private ArrayList<Fragment> list;//显示ViewPager的页面 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewPager viewPager=(ViewPager) findViewById(R.id.viewPager); list=new ArrayList<Fragment>(); PagerFragment fragment1=new PagerFragment(); Bundle bundle=new Bundle(); bundle.putString("value", "第一个页面"); fragment1.setArguments(bundle); list.add(fragment1); PagerFragment fragment2=new PagerFragment(); Bundle bundle2=new Bundle(); bundle2.putString("value", "第二个页面"); fragment2.setArguments(bundle2); list.add(fragment2); PagerFragment fragment3=new PagerFragment(); Bundle bundle3=new Bundle(); bundle3.putString("value", "第三个页面"); fragment3.setArguments(bundle3); list.add(fragment3); viewPager.setAdapter(new MyAdapter(getSupportFragmentManager())); } class MyAdapter extends FragmentPagerAdapter{ public MyAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return list.get(position); } @Override public int getCount() { return list.size(); } } }
碎片类:PagerFragment.java
import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; /** * 需要导入v4包下的 */ public class PagerFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_layout, null); TextView textView = (TextView) view.findViewById(R.id.textView); String string = getArguments().getString("value"); textView.setText(string); ListView listView = (ListView) view.findViewById(R.id.listView); listView.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.list1))); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getActivity(), "点击了"+parent.getItemAtPosition(position), 0).show(); } }); return view; } }
主布局文件:activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="#ffcccc" > <TextView android:id="@+id/tv_01" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="20sp" android:textColor="#000000" android:text="奥运" android:gravity="center" android:background="#ff0000" android:layout_margin="2dp" android:padding="10dp" android:clickable="true" /> <TextView android:id="@+id/tv_02" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="20sp" android:textColor="#000000" android:text="宝强" android:gravity="center" android:background="#ff0000" android:layout_margin="2dp" android:padding="10dp" android:clickable="true" /> <TextView android:id="@+id/tv_03" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="20sp" android:textColor="#000000" android:text="视屏" android:gravity="center" android:background="#ff0000" android:layout_margin="2dp" android:padding="10dp" android:clickable="true" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="2dp" android:background="#000000" /> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" ></android.support.v4.view.ViewPager> </LinearLayout>
碎片布局 fragment_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffcccc" android:orientation="vertical" > <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30sp" android:layout_gravity="center" android:text="TextView" /> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/listView" android:entries="@array/list1"/> </LinearLayout>
效果如下:
上面的页面是创建了三个布局文件来做为碎片适配器的数据,也可以用一个碎片代替所有的布局,在创建这个布局的时候再确定碎片的显示布局:
public class GuideActivity extends FragmentActivity { private ArrayList<Fragment> list; private int[] imgs=new int[]{R.drawable.a,R.drawable.c,R.drawable.d}; private LinearLayout guide_index; /** * 指示器当前的图片 */ private int imgCurrent=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_guide); ViewPager viewPager=(ViewPager) findViewById(R.id.guide_viewPager); guide_index = (LinearLayout) findViewById(R.id.guide_index); initData(); System.out.println("进入向导页"); viewPager.setAdapter(new MyFragmentAdapter(getSupportFragmentManager())); viewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { guide_index.getChildAt(imgCurrent).setEnabled(true); guide_index.getChildAt(arg0).setEnabled(false); imgCurrent=arg0; } @Override//arg2为像素点 public void onPageScrolled(int arg0, float arg1, int arg2) { //System.out.println(arg2); } @Override public void onPageScrollStateChanged(int arg0) { } }); guide_index.getChildAt(0).setEnabled(false);//第一次启动 } /** * 初始化fragment,和指示器 */ private void initData() { list = new ArrayList<Fragment>(); for (int i = 0; i < imgs.length; i++) { GuideFragment fragment=new GuideFragment(); Bundle bundle=new Bundle(); bundle.putInt("index", i); bundle.putInt("imgId", imgs[i]); fragment.setArguments(bundle); list.add(fragment); ImageView img=new ImageView(this); LinearLayout.LayoutParams params=new LayoutParams(25,25);//布局参数,point的布局宽与高 params.rightMargin=10;//右边距 img.setLayoutParams(params);//设置布局参数 img.setBackgroundResource(R.drawable.point_selector); guide_index.addView(img); } } /** * 引导页的适配器 */ class MyFragmentAdapter extends FragmentPagerAdapter{ public MyFragmentAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int arg0) { return list.get(arg0); } @Override public int getCount() { return list.size(); } } }
碎片类:
import com.example.work.MainActivity; import com.example.work.R; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; public class GuideFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.guide_layout, null); View img = view.findViewById(R.id.guide_imageView); //根据传进来的数据为控件设置数据 Button btn = (Button) view.findViewById(R.id.guide_btn); int index = getArguments().getInt("index"); img.setBackgroundResource(getArguments().getInt("imgId")); if(index!=2){ btn.setVisibility(View.GONE); }else{ btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //进入应用 getActivity().startActivity(new Intent(getActivity(),MainActivity.class)); } }); } return view; } }
碎片的显示的布局文件
<?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" > <ImageView android:id="@+id/guide_imageView" android:layout_width="match_parent" android:layout_height="match_parent"/> <Button android:id="@+id/guide_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="60dp" android:text="点击立即体验" /> </RelativeLayout>