Android开发——线上商城app框架搭建(一)


前言

第一次写类似的学习分享类博客,经验不足,写得不好,请多多包涵

提示:以下是本篇文章正文内容

一、实现效果图预览

1、首页界面

​​​​​​​​​​在这里插入图片描述

2、点击首页列表栏图片后,跳转至详情界面

在这里插入图片描述
3、演示视频如下:

二、功能说明

设计一个线上商城的界面UI,包括上中下三结构,包含四个界面:首页、分类、发现、我的,点击下方四个按钮即可实现界面跳转,并可以在首页实现瀑布流列表效果。

三、实现说明及具体代码

1、界面上中下结构:

由上图可清晰看出该界面由三部分组成,这里实现的方法是用一个含有中间部分的主界面xml文件(activity_main.xml),把顶部xml(layout_top.xml)及底部xml(layout_bottom.xml)显示出来。

在这里插入图片描述

activity_main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="bottom"
        android:orientation="vertical">

        <!--这里是 include引入我们的top导航栏,类似组件复用的概念-->
        <include layout="@layout/layout_top" />

        <FrameLayout
            android:id="@+id/framelayout1"
            android:layout_width="match_parent"
            android:layout_height="459dp"
            android:layout_marginBottom="20dp"
            android:layout_weight="1">

        </FrameLayout>

        <include layout="@layout/layout_bottom"/>
    </LinearLayout>
</LinearLayout>

layout_top.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_gravity="top"
    android:orientation="vertical"
    android:padding="8dp">

    <!-- 搜索栏 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <!-- 搜索图标 -->
        <ImageView
            android:id="@+id/imageView_search_icon"
            android:layout_width="32dp"
            android:layout_height="62dp"
            android:layout_gravity="center_vertical"
            android:src="@drawable/ic_search" /> 

        <!-- 搜索输入框 -->
        <EditText
            android:id="@+id/editText_search"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="8dp"
            android:layout_weight="1"
            android:hint="尤尼克斯天斧100zz"
            android:inputType="text"
            android:textSize="16sp" />

        <!-- 搜索按钮 -->
        <Button
            android:id="@+id/button_search"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="5dp"
            android:text="Search"
            android:textSize="16sp" />
    </LinearLayout>
</LinearLayout>

layout_top.xml的效果:
在这里插入图片描述
布局了一个搜索栏及启动搜索按钮(由于还未部署联网或数据库功能,次搜索栏及按钮还不具备任何功能)

layout_bottom.xml文件

<?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="100dp"
    android:layout_gravity="bottom"
    android:orientation="horizontal"
    android:weightSum="4">

    <LinearLayout
        android:id="@+id/linearLayout_1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:layout_gravity="center"
            android:layout_marginBottom="4dp"

            android:scaleType="centerCrop"
            android:visibility="visible"
            tools:srcCompat="@drawable/img_2" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="36dp"
            android:gravity="center"
            android:text="首页"
            android:textSize="24sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout_2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:layout_gravity="center"
            android:layout_marginBottom="4dp"
            android:scaleType="centerCrop"
            android:visibility="visible"
            tools:srcCompat="@drawable/img_3" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="分类"
            android:textSize="24sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout_3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/imageView3"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:layout_gravity="center"
            android:layout_marginBottom="4dp"
            android:scaleType="centerCrop"
            android:visibility="visible"
            tools:srcCompat="@drawable/img_4" />

        <TextView
            android:id="@+id/textView3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="发现"
            android:textSize="24sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout_4"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/imageView4"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:layout_gravity="center"
            android:layout_marginBottom="4dp"
            android:scaleType="centerCrop"
            android:visibility="visible"
            tools:srcCompat="@drawable/img_5" />

        <TextView
            android:id="@+id/textView4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="我的"
            android:textSize="24sp" />
    </LinearLayout>
</LinearLayout>

layout_bottom.xml效果:
在这里插入图片描述
这里我使用了四个LinearLayout组件,其中包括一个ImageView和TextView

2、页面跳转

先上代码Mainactivity.java

package com.example.myapplication;

import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.viewpager2.widget.ViewPager2;

import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    LinearLayout layout1,layout2,layout3,layout4;
    Fragment fragment1,fragment2,fragment3,fragment4;
    FragmentManager manager;
    FragmentTransaction transaction;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        layout1=findViewById(R.id.linearLayout_1);
        layout2=findViewById(R.id.linearLayout_2);
        layout3=findViewById(R.id.linearLayout_3);
        layout4=findViewById(R.id.linearLayout_4);


        fragment1=new Fragment1();
        fragment2=new Fragment2();
        fragment3=new Fragment3();
        fragment4=new Fragment4();


        manager=getSupportFragmentManager();
        transaction =manager.beginTransaction();


        initial();
        fragmentHide();

        transaction.show(fragment1);
        transaction.commit();
        layout1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                transaction=manager.beginTransaction();
                fragmentHide();
                transaction.show(fragment1);
                transaction.commit();
            }
        });


        layout2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                transaction=manager.beginTransaction();
                fragmentHide();
                transaction.show(fragment2);
                transaction.commit();
            }
        });
        layout3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                transaction=manager.beginTransaction();
                fragmentHide();
                transaction.show(fragment3);
                transaction.commit();
            }
        });
        layout4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                transaction=manager.beginTransaction();
                fragmentHide();
                transaction.show(fragment4);
                transaction.commit();
            }
        });


    }

    void initial() {
        transaction.add(R.id.framelayout1,fragment1);
        transaction.add(R.id.framelayout1,fragment2);
        transaction.add(R.id.framelayout1,fragment3);
        transaction.add(R.id.framelayout1,fragment4);
    }


    void fragmentHide()
    {
        transaction.hide(fragment1);
        transaction.hide(fragment2);
        transaction.hide(fragment3);
        transaction.hide(fragment4);
    }

}

在主界面Mainactivity.java中定义四个Fragment框架,作为四个tab页。

manager=getSupportFragmentManager();
transaction =manager.beginTransaction();
initial();
fragmentHide();
transaction.show(fragment1);
transaction.commit();

如上代码使界面首先显示Fragment1,即主页

layout1=findViewById(R.id.linearLayout_1);
layout1.setOnClickListener(new View.OnClickListener()

这里以layout1为例,首先layout1通过layout1=findViewById(R.id.linearLayout_1);与linearLayout(layout_bottom.xml中)关联,然后通过setOnClickListener监听点击操作

transaction=manager.beginTransaction();
fragmentHide();
transaction.show(fragment1);
transaction.commit();

通过隐藏当前Fragment,展示目标Fragment,实现界面跳转操作

在这里插入图片描述

3、具体页面

因为我只拿Fragment1练了练手,所以这里我先说明一下Fragment1及其对应的xml文件。

(1)总体介绍

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical">

        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/viewPager_images"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:orientation="horizontal" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView_staggered"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clipToPadding="false"
            android:padding="4dp" />

        <!-- 瀑布流RecyclerView -->

    </LinearLayout>

</LinearLayout>

我使用了两个控件,分别是viewpager2瀑布流RecyclerView,前者可实现多张图片的横向滑动显示,后者可实现多张图片的瀑布流显示

Fragment1.java

package com.example.myapplication;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import androidx.viewpager2.widget.ViewPager2;

import java.util.Arrays;
import java.util.List;

public class Fragment1 extends Fragment {
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    private String mParam1;
    private String mParam2;
    private ViewPager2 viewPager;
    private List<Integer> imageResourceIds;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
        imageResourceIds = Arrays.asList(
                R.drawable.img,
                R.drawable.img_1,
                R.drawable.p3,
                R.drawable.p1,
                R.drawable.p2,
                R.drawable.p3,
                R.drawable.img,
                R.drawable.img_1,
                R.drawable.p4,
                R.drawable.img,
                R.drawable.img_1,
                R.drawable.p3
        );
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_1, container, false);

        viewPager = view.findViewById(R.id.viewPager_images);
        ImagePagerAdapter adapter = new ImagePagerAdapter(this, imageResourceIds);
        viewPager.setAdapter(adapter);

        // 初始化 RecyclerView
        RecyclerView recyclerView = view.findViewById(R.id.recyclerView_staggered);
        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(staggeredGridLayoutManager);
        StaggeredGridAdapter adapter1 = new StaggeredGridAdapter(getContext(), imageResourceIds); 
        adapter1.setOnItemClickListener(new StaggeredGridAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(Context context, int position) {
                // 创建 Intent 并跳转到 DetailActivity
                Intent intent = new Intent(context, f1_details.class);
                intent.putExtra("position", position);

                startActivity(intent);
            }
        });

        recyclerView.setAdapter(adapter1);

        return view;
    }
}

定义一个名为imageResourceIds的图片列表,作为以上两个控件的显示图片源。(只是搭框架,所以图片是我随便找的几张)

View view = inflater.inflate(R.layout.fragment_1, container, false);
viewPager = view.findViewById(R.id.viewPager_images);
ImagePagerAdapter adapter = new ImagePagerAdapter(this, imageResourceIds);
viewPager.setAdapter(adapter);

上述代码段实例化了ImagePagerAdapter适配器,并联系到imageResourceIds。(adapter相关内容在下方说明)

RecyclerView recyclerView = view.findViewById(R.id.recyclerView_staggered);
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
StaggeredGridAdapter adapter1 = new StaggeredGridAdapter(getContext(), imageResourceIds);

与上面相同,实例化了一个StaggeredGridLayoutManager适配器,同时对其进行简单设置,包括图片展示设置为两列

adapter1.setOnItemClickListener(newStaggeredGridAdapter.OnItemClickListener() {
@Override
public void onItemClick(Context context, int position) {
// 创建 Intent 并跳转到 DetailActivity
Intent intent = new Intent(context, f1_details.class);
intent.putExtra(“position”, position);
startActivity(intent);
}
});
recyclerView.setAdapter(adapter1);

(2) ImagePagerAdapter

ImagePagerAdapter.java文件

package com.example.myapplication;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class ImagePagerAdapter extends RecyclerView.Adapter<ImagePagerAdapter.ImageViewHolder> {

    private List<Integer> imageResourceIds;

    public ImagePagerAdapter(Fragment1 fragment1, List<Integer> imageResourceIds) {
        this.imageResourceIds = imageResourceIds;
    }

    @NonNull
    @Override
    public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image, parent, false);
        return new ImageViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
        holder.imageView.setImageResource(imageResourceIds.get(position));
    }

    @Override
    public int getItemCount() {
        return imageResourceIds.size();
    }

    public static class ImageViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;

        public ImageViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageView);
        }
    }
}

ImagePagerAdapter适配器通过接收一个图像资源ID的列表(List),然后将这些图像资源绑定到 RecyclerView 的每个条目(item)上

(3)StaggeredGridAdapter

package com.example.myapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class StaggeredGridAdapter extends RecyclerView.Adapter<StaggeredGridAdapter.ViewHolder> {
    private Context mContext;
    private List<Integer> mImageResourceIds;
    private OnItemClickListener mOnItemClickListener;


    public interface OnItemClickListener {
        void onItemClick(Context context, int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }


    public StaggeredGridAdapter(Context context, List<Integer> imageResourceIds) {
        mContext = context;
        mImageResourceIds = imageResourceIds;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_staggered_grid, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.imageView.setImageResource(mImageResourceIds.get(position));
        holder.itemView.setOnClickListener(v -> {
            if (mOnItemClickListener != null) {
                mOnItemClickListener.onItemClick(mContext, position);
            }
        });
    }

    @Override
    public int getItemCount() {
        return mImageResourceIds.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageView);
        }
    }
}

StaggeredGridAdapter与上面的ImagePagerAdapter差不多,多了一个点击监听函数(涉及到详情页跳转,后文会专门叙述),这里不赘述。

(4)详情页面跳转

Fragment1.java

StaggeredGridAdapter adapter1 = new StaggeredGridAdapter(getContext(), imageResourceIds);
adapter1.setOnItemClickListener(new

StaggeredGridAdapter.OnItemClickListener() {
@Override
public void onItemClick(Context context, int position) {
// 创建 Intent 并跳转到 DetailActivity
Intent intent = new Intent(context, f1_details.class);
// 如果需要传递位置或其他数据,可以使用 putExtra
intent.putExtra(“position”, position);
startActivity(intent);
}
});

StaggeredGridAdapter.java

private OnItemClickListener mOnItemClickListener;

public interface OnItemClickListener {
void onItemClick(Context context, int position);
}

public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}

f1_details.java(详情页面)

package com.example.myapplication;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Arrays;
import java.util.List;
public class f1_details extends AppCompatActivity {
private ImageView imageView;
private int imageResourceId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_f1_details); // 确保这个布局文件中有一个ImageView
imageView = findViewById(R.id.f1_imageView); // 替换为您的ImageView的ID
// 从Intent中获取传递的位置
Intent intent = getIntent();
int position = intent.getIntExtra(“position”, -1); // -1是一个默认值,如果传递失败则使用
// 假设您有一个与RecyclerView中相同的图片资源列表
List imageResourceIds = Arrays.asList(
R.drawable.img,
R.drawable.img_1,
R.drawable.p3,
R.drawable.p1,
R.drawable.p2,
R.drawable.p3,
R.drawable.img,
R.drawable.img_1,
R.drawable.p4,
R.drawable.img,
R.drawable.img_1,
R.drawable.p3
);
// 检查位置是否有效,并设置ImageView
if (position >= 0 && position < imageResourceIds.size()) {
imageResourceId = imageResourceIds.get(position);
imageView.setImageResource(imageResourceId);
}
}
}

通过以上代码,即可实现点击瀑布流中的图片跳转到f1_details.java(详情页面)

四、源码地址

源码地址(gitee)


总结

以上就是今天要讲的内容,本文仅仅简单介绍了框架的搭建,后续将会对功能进行完善,界面进行美化。

感言

对于编程小白的我来说,之前虽然学习过多种编程语言,也开发过简单的项目,但从来没有像android开发这样让我如此感兴趣的,你输入的每一行代码都能立刻给到你反馈,设计一个UI界面,做好一个功能,虽然过程艰难,但成就感是无限的。这也是我第一次写这么长的blog,虽然花时间而且累,但是我也感觉挺有意思的,收获良多,以后我会多尝试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值