时隔多日,上次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,不便之处,大家自己修改)
完成效果如图:
文章排版很乱,望大家理解。