碎片的使用

要求

新建一个项目,项目中包含 2 Fragment
第一个 Fragment 包含一个 RecyclerView , 每个 item 的界面为左侧一个水果图像,右侧显示水果名称和单价,点击任一 item 可显示第二个 Fragment, 如图 1a
第二个 Fragment 界面如图 1b 所示,点击其中的“ + ”,“ - “键可更改订单数量;
程序根据使用设备的屏幕大小自动排列 2 Fragment, 如果是手机则把第一个 Fragment 置于第一个 Activity, 第二个 Fragment 置于第二个 Activity, 点击 item 从第一个 Activity 跳转到第二个 Activity; 如果是平板,则 2 Fragment 置于同一个 Activity 中,第一个 Fragment 在左,第二个 Fragment 在右,第二个 Fragment 中的内容随所选 item 的变化而变化。

MainActivity:

package com.example.yzlweek6

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

 activity_main布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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/fruitTitleLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/fruitTitleFrag"
        android:name="com.example.yzlweek6.FruitTitleFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</FrameLayout>

FruitContentActivity:

package com.example.yzlweek6

import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class FruitContentActivity : AppCompatActivity() {

    companion object{
        fun actionStart(context: Context, name:String, imageid:Int, fruitprice:String){
            val intent=Intent(context,FruitContentActivity::class.java).apply {
                putExtra("fruit_name",name)
                putExtra("fruit_imageid",imageid)
                putExtra("fruit_price",fruitprice)
            }
            context.startActivity(intent)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_fruit_content)
        val name=intent.getStringExtra("fruit_name")
        val imageid= intent.getIntExtra("fruit_imageid",0)
        val fruitprice=intent.getStringExtra("fruit_price")
        if (name!=null&&fruitprice!=null){
            val fragment=supportFragmentManager.findFragmentById(R.id.fruitContentFrag) as FruitContentFragment
            fragment.refresh(name,imageid,fruitprice)
        }
    }
}

 activity_fruit_content布局:

package com.example.yzlweek6

import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class FruitContentActivity : AppCompatActivity() {

    companion object{
        fun actionStart(context: Context, name:String, imageid:Int, fruitprice:String){
            val intent=Intent(context,FruitContentActivity::class.java).apply {
                putExtra("fruit_name",name)
                putExtra("fruit_imageid",imageid)
                putExtra("fruit_price",fruitprice)
            }
            context.startActivity(intent)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_fruit_content)
        val name=intent.getStringExtra("fruit_name")
        val imageid= intent.getIntExtra("fruit_imageid",0)
        val fruitprice=intent.getStringExtra("fruit_price")
        if (name!=null&&fruitprice!=null){
            val fragment=supportFragmentManager.findFragmentById(R.id.fruitContentFrag) as FruitContentFragment
            fragment.refresh(name,imageid,fruitprice)
        }
    }
}

FruitTitleFragment:

package com.example.yzlweek6

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class FruitTitleFragment:Fragment() {
    private var isTwoPane=false

    inner class FruitAdapter(val fruitList: List<Fruit>):RecyclerView.Adapter<FruitAdapter.ViewHolder>(){
        inner class ViewHolder(view: View):RecyclerView.ViewHolder(view){
            val name:TextView=view.findViewById(R.id.fruitname)
            val fruitimage:ImageView=view.findViewById(R.id.fruitImage)
            val fruitprice:TextView=view.findViewById(R.id.fruitprice)
        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            val view=LayoutInflater.from(parent.context).inflate(R.layout.fruit_item,parent,false)
            val holder=ViewHolder(view)
            holder.itemView.setOnClickListener{
                val fruit=fruitList[holder.adapterPosition]
                if (isTwoPane){
                    activity?.apply {
                        val fragment=supportFragmentManager.findFragmentById(R.id.fruitContentFrag) as FruitContentFragment
                        fragment.refresh(fruit.name,fruit.imageid,fruit.fruitprice)
                    }
                }else{
                    FruitContentActivity.actionStart(parent.context,fruit.name,fruit.imageid,fruit.fruitprice)
                }
            }
            return holder
        }

        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            val fruit=fruitList[position]
            holder.fruitimage.setImageResource(fruit.imageid)
            holder.name.text=fruit.name
            holder.fruitprice.text=fruit.fruitprice
        }

        override fun getItemCount()=fruitList.size
    }


    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fruit_title_frag,container,false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        isTwoPane=activity?.findViewById<View>(R.id.fruitContentLayout)!=null
        val layoutManager=LinearLayoutManager(activity)
        activity?.apply {
            val fruitTitleRecyclerView:RecyclerView=findViewById(R.id.fruitTitleRecyclerView)
            fruitTitleRecyclerView.layoutManager=layoutManager
            val adapter=FruitAdapter(getFruit())
            fruitTitleRecyclerView.adapter=adapter
        }
    }

    private fun getFruit():List<Fruit>{
        val fruitlist=ArrayList<Fruit>()
        fruitlist.add(Fruit("apple",R.drawable.apple_pic,"$2/kg"))
        fruitlist.add(Fruit("banana",R.drawable.banana_pic,"$4/kg"))
        fruitlist.add(Fruit("orange",R.drawable.orange_pic,"$5/kg"))
        fruitlist.add(Fruit("watermalon",R.drawable.watermelon_pic,"$6/kg"))
        fruitlist.add(Fruit("pear",R.drawable.pear_pic,"$7/kg"))
        fruitlist.add(Fruit("pineapple",R.drawable.pineapple_pic,"$8/kg"))
        fruitlist.add(Fruit("strawberry",R.drawable.strawberry_pic,"$9/kg"))
        fruitlist.add(Fruit("cherry",R.drawable.cherry_pic,"$10/kg"))
        fruitlist.add(Fruit("mango",R.drawable.mango_pic,"$11/kg"))
        return fruitlist
    }
}

fruit_title_frag布局:

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

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/fruitTitleRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

FruitContentFragment:

package com.example.yzlweek6

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.fragment.app.Fragment

class FruitContentFragment:Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view=inflater.inflate(R.layout.fruit_content_frag,container,false)
        val decreaseButton=view.findViewById<Button>(R.id.decreaseButton)
        val increaseButton=view.findViewById<Button>(R.id.increaseButton)
        val OrderButton=view.findViewById<Button>(R.id.Order)
        val fruitNumber=view.findViewById<TextView>(R.id.fruitNumber)
        val price=view.findViewById<TextView>(R.id.price)
        val unitprice=view.findViewById<TextView>(R.id.unitprice)
        val fruitName=view.findViewById<TextView>(R.id.fruitName)
        decreaseButton.setOnClickListener {
            var num=fruitNumber.text.toString().toInt()
            if (num>0){
                fruitNumber.text=num.toString()
                num-=1
                fruitNumber.text=num.toString()
                val pricestr=(num*unitprice.text.toString().replace("$","").replace("/kg","").toInt()).toFloat()
                price.text="$"+String.format("%.2f",pricestr)
            }
        }
        increaseButton.setOnClickListener {
            var num=fruitNumber.text.toString().toInt()
            fruitNumber.text=num.toString()
            num+=1
            fruitNumber.text=num.toString()
            val pricestr=(num*unitprice.text.toString().replace("$","").replace("/kg","").toInt()).toFloat()
            price.text="$"+String.format("%.2f",pricestr)
        }
        OrderButton.setOnClickListener {
            var num=fruitNumber.text.toString().toInt()
            fruitNumber.text=num.toString()
            Toast.makeText(context,"您已订购了,${fruitNumber.text}kg${fruitName.text},总计${price.text}$",Toast.LENGTH_SHORT).show()
        }
        return view
    }

    fun refresh(name:String,imageid:Int,fruitprice:String){
        activity?.apply {
            val contentLayout=findViewById<LinearLayout>(R.id.contentLayout)
            contentLayout.visibility=View.VISIBLE
            val fruitName=findViewById<TextView>(R.id.fruitName)
            fruitName.text=name
            val fruitImage=findViewById<ImageView>(R.id.fruitimage)
            fruitImage.setImageResource(imageid)
            val unitprice=findViewById<TextView>(R.id.unitprice)
            unitprice.text=fruitprice
            val fruitNumber=findViewById<TextView>(R.id.fruitNumber)
            fruitNumber.text="0"
            val price=findViewById<TextView>(R.id.price)
            price.text="$0.00"
        }
    }
}

fruit_content_frag布局:

<?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">

    <LinearLayout
        android:id="@+id/contentLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:visibility="invisible">

        <TextView
            android:id="@+id/fruitName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="10dp"
            android:textSize="20sp" />

        <ImageView
            android:id="@+id/fruitimage"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_gravity="center"
            android:layout_marginTop="50dp"/>

        <RelativeLayout
            android:id="@+id/UnitPriceLayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="50dp">

            <TextView
                android:id="@+id/UnitPrice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:textSize="20sp"
                android:text="Unit Price:"/>
            
            <TextView
                android:id="@+id/unitprice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:textSize="20sp"
                android:layout_toRightOf="@+id/UnitPrice"/>

        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/fruitAmountLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:padding="10dp">

            <TextView
                android:id="@+id/fruitAmount"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="50dp"
                android:padding="10dp"
                android:text="Amount:"
                android:textSize="20sp" />

            <Button
                android:id="@+id/decreaseButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@id/fruitAmount"
                android:text="-" />

            <TextView
                android:id="@+id/fruitNumber"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:textSize="20sp"
                android:text="0"
                android:layout_toRightOf="@id/decreaseButton"/>

            <Button
                android:id="@+id/increaseButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@id/fruitNumber"
                android:text="+" />

        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/totalPriceLayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:padding="10dp">

            <TextView
                android:id="@+id/totalPrice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:textSize="20sp"
                android:text="Total Price:"/>
            
            <TextView
                android:id="@+id/price"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@id/totalPrice"
                android:padding="10dp"
                android:textSize="20sp"
                android:text="$0.00"/>

        </RelativeLayout>

        <Button
            android:id="@+id/Order"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="Order"/>

    </LinearLayout>

    <View
        android:layout_width="1dp"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:background="#000"/>

</RelativeLayout>

Fruit:

package com.example.yzlweek6

class Fruit(val name:String, val imageid:Int, var fruitprice:String)

fruit_item布局:

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

    <ImageView
        android:id="@+id/fruitImage"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"/>

    <LinearLayout
        android:id="@+id/right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp">
        <TextView
            android:id="@+id/fruitname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </TextView>

    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/fruitprice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:textColor="@android:color/darker_gray">
        </TextView>
    </RelativeLayout>


</LinearLayout>

sw600dp/activity_main布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/fruitTitleFrag"
        android:name="com.example.yzlweek6.FruitTitleFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <FrameLayout
        android:id="@+id/fruitContentLayout"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3">

        <fragment
            android:id="@+id/fruitContentFrag"
            android:name="com.example.yzlweek6.FruitContentFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </FrameLayout>

</LinearLayout>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值