【Android移动开发】使用Fragment碎片搭建框架实现不同页面切换

实现效果:
本篇只讲使用Fragment碎片搭建框架实现不同页面切换,至于页面内容暂不讲,因为这涉及的知识点较多还有很多第三方库.
在这里插入图片描述

步骤:

  1. 定义主页面布局
<?xml version="1.0" encoding="utf-8"?>
<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:background="#ffffff"
    android:orientation="vertical"
    tools:context="com.lyx.mycommunity.app.MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_user"/>
    <FrameLayout
    android:id="@+id/frameLayout"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />
    <RadioGroup
        android:id="@+id/rg_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@drawable/home_bottom_parent_bg"
        android:orientation="horizontal">
        <RadioButton
            android:id="@+id/rb_home"
            style="@style/MainButtonStyle"
            android:drawableTop="@drawable/home_button_selector"
            android:text=" 首页" />
        <RadioButton
            android:id="@+id/rb_category"
            style="@style/MainButtonStyle"
            android:drawableTop="@drawable/category_button_selector"
            android:text=" 服务" />
        <RadioButton
            android:id="@+id/rb_community"
            style="@style/MainButtonStyle"
            android:drawableTop="@drawable/community_button_selector"
            android:paddingTop="10dp"
            android:text=" 新闻" />
        <RadioButton
            android:id="@+id/rb_search"
            style="@style/MainButtonStyle"
            android:drawableTop="@drawable/cart_button_selector"
            android:text=" 搜索" />
        <RadioButton
            android:id="@+id/rb_user"
            style="@style/MainButtonStyle"
            android:drawableTop="@drawable/user_button_selector"
            android:text=" 个人中心" />
    </RadioGroup>

</LinearLayout>
  1. 新建一个类继承Fragment类或者他的子类,重写onCreateView()onActivityCreated()方法 在onCreateView()方法中调用:inflater.inflate()方法加载Fragment的布局文件,并返回加载的view对象
package com.lyx.mycommunity.base;


import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public abstract class BaseFragment extends Fragment {
  public Context myContext;


  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myContext = getActivity();

  }

  @Nullable
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return initView();
  }

  @Override
  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    initData();
  }

  /**
   *由子类实现,实现特有效果
   * @return
   */
  public abstract View initView();

  /**
   * 初始化数据
   */
  public void initData() {

  }


}

  1. 在onActivityCreated()中初始化碎片页面中要显示的数据
  @Override
  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    initData();
  }
  1. 在主Activity页面中实例化各个Fragment碎片,并进行相关事件监听处理
fragments = new ArrayList<>();
fragments.add(new HomeFragment());
fragments.add(new ServiceFragment());
fragments.add(new NewsFragment());
fragments.add(new SearchFragment());
fragments.add(new UserFragment());

主Activity页面代码:

package com.lyx.mycommunity.app;

import android.content.Intent;
import android.os.Bundle;

import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.RecyclerView;

import com.lyx.mycommunity.adapter.HomeRecycleAdapter;
import com.lyx.mycommunity.base.BaseFragment;
import com.lyx.mycommunity.fragment.ServiceFragment;
import com.lyx.mycommunity.fragment.NewsFragment;
import com.lyx.mycommunity.fragment.HomeFragment;
import com.lyx.mycommunity.fragment.UserFragment;
import com.lyx.mycommunity.utils.BatteryChangeReceiver;
import com.lyx.shoppingcity.R;
import com.lyx.mycommunity.fragment.SearchFragment;

import java.util.ArrayList;
import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;

public class MainActivity extends FragmentActivity {

    @Bind(R.id.frameLayout)
    FrameLayout frameLayout;
    @Bind(R.id.rb_home)
    RadioButton rbHome;
    @Bind(R.id.rb_category)
    RadioButton rbType;
    @Bind(R.id.rb_community)
    RadioButton rbCommunity;
    @Bind(R.id.rb_search)
    RadioButton rbSearch;
    @Bind(R.id.rb_user)
    RadioButton rbUser;
    @Bind(R.id.rg_main)
    RadioGroup rgMain;
    private ArrayList<BaseFragment> fragments;
    private int position;
    private BaseFragment myContext;
    private RecyclerView rvHome;
    private HomeRecycleAdapter adapterDome;
    private Intent intent;
    private String struser;
    private TextView tv_user;
    /**
     * 缓存的Fragemnt或者上次显示的Fragment
     */
    private Fragment tempFragemnt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        initFragment();
        initListener();
    }

    private void initFragment() {
        fragments = new ArrayList<>();
        fragments.add(new HomeFragment());
        fragments.add(new ServiceFragment());
        fragments.add(new NewsFragment());
        fragments.add(new SearchFragment());
        fragments.add(new UserFragment());
    }

    // 点击radiobutton的事件监听
    private void initListener() {
        rgMain.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId) {
                    case R.id.rb_home:
                        position = 0;

                        break;
                    case R.id.rb_category:

                        position = 1;
                        break;
                    case R.id.rb_community:
                        position = 2;

                        break;
                    case R.id.rb_search:
                        position = 3;
                        intent = new Intent(MainActivity.this,NoteShowActivity.class);
                        startActivity(intent);
                        break;
                    case R.id.rb_user:
                        position = 4;

                        break;
                }

                // 获取相应的fragment位置
                BaseFragment baseFragment = getFragment(position);
                switchFragment(tempFragemnt, baseFragment);
            }
        });

        rgMain.check(R.id.rb_home);

    }


    /**
     *
     * @param position
     * @return
     */
    private BaseFragment getFragment(int position) {
        if (fragments != null && fragments.size() > 0) {
            BaseFragment baseFragment = fragments.get(position);
            return baseFragment;
        }
        return null;
    }

    // 隐藏上一个fragment
    private void switchFragment(Fragment fromFragment, BaseFragment nextFragment) {
        if (tempFragemnt != nextFragment) {
            tempFragemnt = nextFragment;
            if (nextFragment != null) {
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                //判断nextFragment是否添加
                if (!nextFragment.isAdded()) {
                    //隐藏当前Fragment
                    if (fromFragment != null) {
                        transaction.hide(fromFragment);
                    }
                    //添加Fragment
                    transaction.add(R.id.frameLayout, nextFragment).commit();
                } else {
                    //隐藏当前Fragment
                    if (fromFragment != null) {
                        transaction.hide(fromFragment);
                    }
                    transaction.show(nextFragment).commit();
                }
            }
        }
    }

}

  1. 各fragment碎片布局:这里引用相同布局:
<?xml version="1.0" encoding="utf-8"?>
<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">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">

        <TextView
            android:textColor="#464646"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_margin="20dp"
            android:text="我是xx页面"
            android:textSize="20sp" />
    </RelativeLayout>
</LinearLayout>    

用户中心的fragment页面:

package com.lyx.mycommunity.fragment;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import com.lyx.mycommunity.app.LoginActivity;
import com.lyx.mycommunity.app.MessageCenterActivity;
import com.lyx.mycommunity.utils.BatteryChangeReceiver;
import com.lyx.shoppingcity.R;
import com.lyx.mycommunity.base.BaseFragment;

import java.io.File;

public class UserFragment extends BaseFragment implements{
    private static final String TAG =  UserFragment.class.getSimpleName();
    private TextView textView;
    private Context myContent;
    private ImageButton ibUserIconAvator;
    private TextView tvUsercenter;

    private void findViews(View view) {
        ibUserIconAvator = (ImageButton) view.findViewById(R.id.ib_user_icon_avator);
        tvUsercenter = (TextView) view.findViewById(R.id.tv_usercenter);
    }
    @Override
    public View initView() {
        Log.e(TAG, "用户中心的Frament的UI被初始化");
        View view = View.inflate(myContext, R.layout.fragment_user,null);
        findViews(view);
        tvUsercenter.setAlpha(0);

        return view;

    }

    @Override
    public void initData() {
        super.initData();
        Log.e(TAG, "用户中心的Fragment的数据被初始化了");
    }
}

分类的fragment页面:

package com.lyx.mycommunity.fragment;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import com.lyx.mycommunity.app.LoginActivity;
import com.lyx.mycommunity.app.MessageCenterActivity;
import com.lyx.mycommunity.utils.BatteryChangeReceiver;
import com.lyx.shoppingcity.R;
import com.lyx.mycommunity.base.BaseFragment;

import java.io.File;

public class CategoryFragment extends BaseFragment implements{
    private static final String TAG = CategoryFragment.class.getSimpleName();
    private TextView textView;
    private Context myContent;
    private ImageButton ibUserIconAvator;
    private TextView tvUsercenter;

    private void findViews(View view) {
        ibUserIconAvator = (ImageButton) view.findViewById(R.id.ib_user_icon_avator);
        tvUsercenter = (TextView) view.findViewById(R.id.tv_usercenter);
    }
    @Override
    public View initView() {
        Log.e(TAG, "分类页面的Frament的UI被初始化");
        View view = View.inflate(myContext, R.layout.fragment_category,null);
        findViews(view);
        tvUsercenter.setAlpha(0);

        return view;

    }

    @Override
    public void initData() {
        super.initData();
        Log.e(TAG, "分类的Fragment的数据被初始化了");
    }
}


其他几个fragment都是类似上面这个,在initView()中加载UI页面,在initData()初始数据加载.

titlebar.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="60dp"
    android:background="#9448bb"
    android:orientation="horizontal">
    
    <TextView
        android:id="@+id/tv_local"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:layout_margin="10dp"
        android:drawableTop="@mipmap/loca"
        android:text="位置"
        android:textColor="#fff" />

    <EditText
        android:id="@+id/tv_search_home"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:background="@mipmap/btnbgfff"
        android:gravity="center_vertical"
        android:hint="输入搜索信息"
        android:layout_gravity="center"
        android:imeOptions="actionSearch"
        android:paddingLeft="5dp"
        android:drawableLeft="@mipmap/home_search_icon"
        android:layout_margin="2dp"
        android:singleLine="true"
        android:layout_weight="0.67" />
    <TextView
        android:id="@+id/tv_message_home"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:layout_margin="10dp"
        android:drawableTop="@mipmap/new_message_icon"
        android:text=" 消息"
        android:textColor="#fff" />

</LinearLayout>

设置RadioButton选中后的样式community_button_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/main_community" android:state_checked="false"></item>
    <item android:drawable="@mipmap/main_community_press" android:state_checked="true"></item>
</selector>

其他四个都是类似,就是把相应的图标改改,就可以了.

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的安卓应用程序示例,实现左侧 ListView 和右侧 Fragment切换页面。在本示例中,ListView 中的每个项都对应一个 Fragment,并且点击 ListView 中的项时,会将对应的 Fragment 显示在右侧。 1. 创建一个新的安卓项目,并在 MainActivity 的布局文件中添加 ListView 和 FrameLayout 控件: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/list_view" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <FrameLayout android:id="@+id/container" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" /> </LinearLayout> ``` 2. 在 res 文件夹下创建一个新的布局文件 fragment_layout.xml,用于显示右侧的 Fragment: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:textSize="24sp" /> </LinearLayout> ``` 3. 创建一个 Fragment 类 MyFragment,用于显示右侧的 Fragment,并在其布局中显示一个 TextView 控件: ```java public class MyFragment extends Fragment { private TextView textView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_layout, container, false); textView = (TextView) view.findViewById(R.id.text_view); return view; } public void setText(String text) { textView.setText(text); } } ``` 4. 创建一个适配器类 MyAdapter,用于将 Fragment 和 ListView 中的项对应起来: ```java public class MyAdapter extends BaseAdapter { private Context context; private List<String> data; private List<Fragment> fragments; public MyAdapter(Context context, List<String> data, List<Fragment> fragments) { this.context = context; this.data = data; this.fragments = fragments; } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1, parent, false); } TextView textView = (TextView) convertView.findViewById(android.R.id.text1); textView.setText(data.get(position)); convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ((MainActivity) context).showFragment(fragments.get(position)); } }); return convertView; } } ``` 其中,data 是 ListView 的数据集合,fragments 是对应的 Fragment 集合。 5. 在 MainActivity 中创建 ListView 和 Fragment 的实例,并将其绑定到适配器上: ```java public class MainActivity extends AppCompatActivity { private ListView listView; private List<String> data; private List<Fragment> fragments; private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.list_view); data = new ArrayList<>(); data.add("Fragment 1"); data.add("Fragment 2"); data.add("Fragment 3"); fragments = new ArrayList<>(); fragments.add(new MyFragment()); fragments.add(new MyFragment()); fragments.add(new MyFragment()); adapter = new MyAdapter(this, data, fragments); listView.setAdapter(adapter); // 显示默认的 Fragment showFragment(fragments.get(0)); } public void showFragment(Fragment fragment) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.container, fragment); transaction.commit(); } } ``` 在 MainActivity 的 showFragment 方法中,将点击的 Fragment 替换到 FrameLayout 中显示。 这样,就完成了一个简单的安卓应用程序,实现了左侧 ListView 和右侧 Fragment切换页面

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值