时隔多日,上次CSDN把我的草稿吞了后,一直筹划自己的网站写blog,但是各种原因,最终搁浅。
今天带来的是,界面切换RadioButton+fragment,类似QQ、淘宝、微信之类的主页界面切换。而且考虑到各种原因,可能不会太深入的剖析。
首先,我们新建一个项目,会直接生成一个ACTIVITY+layout。这时候我们无需做出任何改变,先删除菜单功能。添加双击返回键退出程序,代码如下:
import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.KeyEvent; import android.view.Window; import android.widget.Toast; public class MainActivity extends FragmentActivity { private long exitTime = 0; //退出时间标记 public String HOMEFRAGEMENT = "homefragement"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); initFragment(); } /** * 填充布局 */ private void initFragment() { //获取窗体碎片管理器 FragmentManager fm = getSupportFragmentManager(); //启动窗体碎片事务 FragmentTransaction transaction = fm.beginTransaction(); //设定Fragment窗体的交换,拿到Acitivity的Fragment布局的ID,后面跟上我们要添加的主页切换的布局,最后的时我们设定的标记 transaction.replace(R.id.activityMain, new HomeFragment(), HOMEFRAGEMENT); //提交事务 transaction.commit(); } /** * 双击返回键退出程序 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { if ((System.currentTimeMillis() - exitTime) > 2000) { Toast.makeText(getApplicationContext(), "再按一次返回键退出程序!!!", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { // 此处加入退出程序代码 finish(); System.exit(0); } return true; } return super.onKeyDown(keyCode, event); } }
上面代码中,值得一提的时,我们在Activity中,设定的布局一定要是FragmentLayout,而且我们的Activity一定要继承FramentActivity。布局代码如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activityMain" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> </FrameLayout>
既然我们已经设定好主界面,并且可以看到在我的主界面中,已经添加好了布局填充的方法,这个时候我们只需要按部就班的,设定便可以了!
思路:设定baseFragment→设定主页FragmentActivity(添加ViewPager(设定baseViewPager→设定每个切换页(继承自baseViewPager)))
baseFragment如下:
import android.support.v4.app.Fragment; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * baseFragment 所有Activity的基类,子类通过使用initViews方法来加载布局 * Created by Acheng on 15/9/15. */ public abstract class BaseFragment extends Fragment { protected FragmentActivity mActivity; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivity = getActivity(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return initViews(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initData(); } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); } @Override public void onDestroy() { super.onDestroy(); } /** * 抽象方法,子类必须实现的创建View对象 * @return */ public abstract View initViews(); /** * 初始化数据,子类可不必实现 */ public void initData(){} }
按照思路,现在我们应当设定FragmentActivity:
import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.view.ViewGroup; import android.widget.RadioGroup; import com.acheng.activityfragment.base.BaseFragment; import com.acheng.activityfragment.base.BasePager; import com.acheng.activityfragment.concretelypager.ActivityPager; import com.acheng.activityfragment.concretelypager.MainCityPager; import com.acheng.activityfragment.concretelypager.ManorsPager; import com.acheng.activityfragment.concretelypager.SetsPager; import com.acheng.activityfragment.concretelypager.ShowsPager; import com.acheng.activityfragment.concretelypager.StoryPager; import java.util.ArrayList; /** * Created by pang-pc on 15/9/15. */ public class HomeFragment extends BaseFragment { private RadioGroup radioGroup; private android.support.v4.view.ViewPager mViewPager; private ArrayList<BasePager> mViewPagerArrayList; private M_ViewPager_Adapter mViewPagerAdapter; @Override public View initViews() { View view = View.inflate(mActivity, R.layout.activity_home, null); radioGroup = (RadioGroup) view.findViewById(R.id.radioGroup); mViewPager = (ViewPager) view.findViewById(R.id.mViewPager); return view; } @Override public void initData() { mViewPagerArrayList = new ArrayList<BasePager>(); //添加主界面Fragment进入布局文件中 { mViewPagerArrayList.add(new MainCityPager(mActivity)); mViewPagerArrayList.add(new ActivityPager(mActivity)); mViewPagerArrayList.add(new ShowsPager(mActivity)); mViewPagerArrayList.add(new ManorsPager(mActivity)); mViewPagerArrayList.add(new StoryPager(mActivity)); mViewPagerArrayList.add(new SetsPager(mActivity)); } //设定主页面布局 mViewPagerAdapter = new M_ViewPager_Adapter(); mViewPager.setAdapter(mViewPagerAdapter); radioGroup.check(R.id.maincity); //设定进入界面标记的底部按钮 mViewPagerArrayList.get(0).initData(); //根据被选择的页面加载对应的数据,降低数据消耗 radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.maincity: mViewPager.setCurrentItem(0, false); //根据点击主页面线面导航栏按钮设定页面跳转 mViewPagerArrayList.get(0).initData(); //根据被选择的页面加载对应的数据,降低数据消耗 break; case R.id.activities: mViewPager.setCurrentItem(1, false); mViewPagerArrayList.get(1).initData(); break; case R.id.shows: mViewPager.setCurrentItem(2, false); mViewPagerArrayList.get(2).initData(); break; case R.id.manors: mViewPager.setCurrentItem(3, false); mViewPagerArrayList.get(3).initData(); break; case R.id.stroy: mViewPager.setCurrentItem(4, false); mViewPagerArrayList.get(4).initData(); break; case R.id.sets: mViewPager.setCurrentItem(5, false); mViewPagerArrayList.get(5).initData(); break; default: break; } } }); } <span style="white-space:pre"> </span>//ViewPager的适配器 class M_ViewPager_Adapter extends PagerAdapter { /** * Return the number of views available. */ @Override public int getCount() { return mViewPagerArrayList.size(); } /** * 决定一个viewpage是不是一个从ViewGroup返回的关联的view * * @param view * @param object * @return */ @Override public boolean isViewFromObject(View view, Object object) { return view == object; } /** * 初始化viewpager,get the view from ViewGroup who has some views. * * @param container * @param position * @return */ @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(mViewPagerArrayList.get(position).mRootView); //根据我们的basepager获取设定好的布局 return mViewPagerArrayList.get(position).mRootView; } /** * 销毁Viewpager,根据切换后的界面来销毁 * * @param container * @param position * @param object */ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } }
我们一步一步按照思路进行,设定好Fragment后,我们需要的是有自己的Viewpager并把它们添加到Fragment中,这时候,我们的BaseViewPager出现了:
import android.app.Activity; import android.view.View; import android.widget.FrameLayout; import android.widget.TextView; import com.acheng.activityfragment.R; public class BasePager { protected final Activity mActivity; public View mRootView; public FrameLayout baseFramlayout; public TextView top_bar_title; public BasePager(Activity activity) { mActivity = activity;<span style="white-space:pre"> </span>//这个时候,其实我们的基础布局已经加载好了,只需要把我们复杂的布局添加进来即可,故此处有activity对象 initViews(); } /** * 布局设定,子类可覆盖修改界面布局,子类覆盖时,请删除(super.initViews();) * @note 注意界面布局文件加载 */ public void initViews() { mRootView = View.inflate(mActivity, R.layout.base_pager, null); baseFramlayout = (FrameLayout) mRootView.findViewById(R.id.baseFramlayout); top_bar_title = (TextView) mRootView.findViewById(R.id.top_bar_title); } /** * 界面数据加载。子类可修改,可不修改 */ public void initData(){} }
既然,我们这里要加载我们的布局,那么这时候布局文件也是必不可少的:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#FEA40A"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:padding="5dp" android:textSize="18sp" android:textColor="#DBDBDB" android:text="退出"/> <TextView android:id="@+id/top_bar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:textSize="18sp" android:textColor="#DBDBDB" android:layout_alignParentTop="true" android:text="标题" android:layout_centerHorizontal="true" /> </RelativeLayout> <FrameLayout android:id="@+id/baseFramlayout" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#474747"> </FrameLayout> </LinearLayout>
现在,我们的baseViewPager已经设定好,这时候,我们只需把我们的详细的ViewPager添加进去,即可:
import android.app.Activity; import android.util.Log; import android.view.View; import android.widget.TextView; import com.acheng.activityfragment.R; import com.acheng.activityfragment.base.BasePager; /** * Created by pang-pc on 15/9/16. */ public class MainCityPager extends BasePager { private TextView top_bar_title; public MainCityPager(Activity activity) { super(activity); } @Override public void initViews() { mRootView = View.inflate(mActivity, R.layout.mancitylayout,null); top_bar_title = (TextView) mRootView.findViewById(R.id.top_bar_title); } @Override public void initData() { Log.i("检查程序什么时候创建fragment", "这个时候创建了,但是创建几次呢?"); top_bar_title.setText("主城"); } }
布局文件如下:
<?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:orientation="vertical" android:id="@+id/main_city_layout"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#FEA40A"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:padding="5dp" android:textSize="18sp" android:textColor="#DBDBDB" android:text="退出"/> <TextView android:id="@+id/top_bar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:textSize="18sp" android:textColor="#DBDBDB" android:layout_alignParentTop="true" android:text="标题" android:layout_centerHorizontal="true" /> </RelativeLayout> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New RadioButton" android:id="@+id/radioButton" /> <Button style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New RadioButton" android:id="@+id/radioButton2" android:layout_gravity="center_vertical" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button2" android:layout_gravity="center_horizontal" /> <Switch android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Switch" android:id="@+id/switch1" android:layout_gravity="center_horizontal" /> <RatingBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ratingBar" android:layout_gravity="center_horizontal" /> </LinearLayout>
剩下的几个ViewPager,也是类似的,只需要我们重写initViews方法即可,这里不再叙述。
由于时间匆忙来不及说明,粗浅之处,望大家海涵,如有需要,请大家下载我上传的文件,在其中可以看到,由于csdn资源审核问题,这里来不及贴出连接。
(从今天起,我上传的安卓项目都是使用Android Studio,不便之处,大家自己修改)
完成效果如图:文章排版很乱,望大家理解。