Android读书笔记之Fragment Arguments的使用

本文介绍如何在Android应用中使用Fragment实现列表项与明细界面的数据同步。通过UUID传递数据,利用监听器更新Item内容,并在返回列表时刷新显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该读书笔记是自己阅读《Android编程权威指南》和《The.Big.Nerd.Ranch.Guide.2nd.Edition》(《Android编程权威指南》第二版)所做的一些笔记。


这次写的是使用fragment argument,主要实现的功能是在先前列表项的基础之上实现点击某一个列表项,弹出一个关于该列表项的明细界面,在该界面中修改的内容,当你返回到原先的列表时能够进行同步。

下面看具体的代码实现。

我们依旧采用Fragment托管Activity的形式,这样会出现一个问题,如果又写一个Activity继承FragmentActivity,就会导致下面的代码被重复写2次,如果界面再加多,就会被重复写更多次。

<span style="white-space:pre">	</span>FragmentManager fragmentManager = getFragmentManager();  
  
        Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);  
  
        if (fragment == null) {  
            fragment = new BlankFragment();  
            fragmentManager.beginTransaction().add(R.id.fragment_container,fragment).commit();  
        }  

所以我们写个如下的抽象类,这样以后托管Fragment的Activity都继承该抽象类,并实现其中的createFragment()方法即可。

package com.example.zhan.fragmenttest;

import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public abstract class SingleFragmentActivity extends FragmentActivity {

    protected abstract Fragment createFragment();

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fragmentManager = getFragmentManager();

        Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);

        if (fragment == null) {
            fragment = createFragment();
            fragmentManager.beginTransaction().add(R.id.fragment_container,fragment).commit();
        }

    }

}

明细界面的Activity代码如下:

package com.example.zhan.fragmenttest;

import android.app.Fragment;
import android.content.Context;
import android.content.Intent;

import java.util.UUID;

public class ItemActivity extends SingleFragmentActivity {

    private final static String EXTRA_ITEM_ID = "item_uuid";

    public static Intent newIntent(Context context, UUID uuid) {
        Intent intent = new Intent(context,ItemActivity.class);
        intent.putExtra(EXTRA_ITEM_ID,uuid);
        return intent;
    }

    @Override
    protected Fragment createFragment() {
        UUID uuid = (UUID) getIntent().getSerializableExtra(EXTRA_ITEM_ID);
        return ItemFragment.newInatance(uuid);
    }

}
该部分的代码功能有两个,一个自然是创建其要托管的Fragment,另一个功能是提供一个静态方法,这样列表界面就是可以通过调用该方法跳转到明细界面。


明细界面的Fragment代码如下:

package com.example.zhan.fragmenttest;

import android.app.Fragment;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

import java.util.UUID;

public class ItemFragment extends Fragment {

    private static final String ARG_ITEM_UUID = "item_uuid";

    private EditText mEditText;

    public static ItemFragment newInatance(UUID uuid) {
        Bundle bundle = new Bundle();
        bundle.putSerializable(ARG_ITEM_UUID, uuid);

        ItemFragment itemFragment = new ItemFragment();
//        Fragment.setArguments(Bundle)方法:注意,该
//        任务必须在fragment创建后、添加给activity前完成
        itemFragment.setArguments(bundle);
        return itemFragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragmnet_item,container,false);
        UUID uuid = (UUID) getArguments().getSerializable(ARG_ITEM_UUID);
        final Item item = ItemLab.get(getActivity()).getItem(uuid);

        mEditText = (EditText) view.findViewById(R.id.textView);
        Button button = (Button) view.findViewById(R.id.button);

        mEditText.setText(item.getTitle());
        mEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                item.setTitle(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        button.setText(item.getTitle());
        return view;
    }

}

这部分代码首先正如注释中所言,因为Fragment.setArguments(Bundle)必须在fragment创建后、添加给activity前完成,所以我们在ItemFragment的静态方法中完成Fragment的创建,并进行该工作,然后在相应的Activity中调用该静态方法。

还有就是为EditText添加监听器,这样在明细界面改变EditText中的内容时,将改变写入到对应的item中,然后在列表项的Fragment中的onResume()方法中调用mItemAdapter.notifyDataSetChanged(),这样当你返回列表界面,你在明细界面做的改变便能同步到列表界面。


补充一点就是在各个界面间进行数据传递的时候,我们不是直接传递Item对象,而是通过传递一个Item对象的唯一标识UUID,然后当你要用到这个Item对象的时候,你再通过这个UUID去ItemLab里取,ItemLab的代码如下:

package com.example.zhan.fragmenttest;

import android.content.Context;

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

public class ItemLab {

    private static ItemLab sItemLab;
    private Context mContext;
    private List<Item> mItemList;

    private ItemLab(Context context) {
        mItemList = new ArrayList();
        for (int i = 0;i < 100;i++) {
            Item item = new Item();
            item.setTitle(String.valueOf(i));
            mItemList.add(item);
        }
    }

    public static ItemLab get(Context context) {
        if (sItemLab == null) {
            sItemLab = new ItemLab(context);
        }
        return sItemLab;
    }

    public List getItemList() {
        return mItemList;
    }

    public Item getItem(UUID uuid) {
        for (Item item : mItemList) {
            if (item.getUUID().equals(uuid)) {
                return item;
            }
        }
        return null;
    }

}

其实ItemLab采用的就是单例模式。


其他细节就看我上传的源代码吧:

http://download.youkuaiyun.com/detail/u014285517/9367393

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值