Fragment在《暗黑3天梯榜》中使用的场景

Fragment在《暗黑3天梯榜》中使用的场景

在《Android编程权威指南》中采用了一种激进的态度来对待Fragment,即“总是使用fragment原则”。《Android编程权威指南》英文名称是《Android Programming the big nerd ranch guide》,很多技术文章都是基于这本书的,在还不是很了解的情况下,我盲目的遵循了这个激进的观点。开发出了我的这个App《暗黑3天梯榜》。

事实就是,就目前来说这个激进的观点带给了我很大的好处。

概述

我在以下这些地方使用了fragment

  • 进度条(闪屏?)。
  • 需要返回数据的选择界面。
  • 数据列表界面。

确切的说,我每个界面都是fragment。fragment最直观的好处就是对UI的自适应是极好的,可以说是吧很多问题都提前挡在了外面。在传递数据方面有arguments。在App中到处都充斥着下面这样的代码

ProgressbarFragment newFragment = new ProgressbarFragment();
Bundle args = new Bundle();
args.putInt(ProgressbarFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragmentContainer, newFragment,"progress");
transaction.commit();

上面是一段代码,用来传递进度条进度的数据,poison代表了进度100种的某个数字。在ProgressbarFragment用下面的办法可以得到传递过去的数据

int position = getArguments().getInt(ARG_POSITION);

一直到这里可能都很普通,没有发现什么问题。在手机中左看看右看看也没有啥问题。是的,现在不会有问题,以后也不会有问题。这一切的原因是因为《Android 编程权威指南》中已经帮你回避了很多问题。

Activity重新创建时,会重新构建它所管理的Fragment,原先的Fragment的字段值将会全部丢失,但是通过 Fragment.setArguments(Bundle bundle)方法设置的bundle会保留下来。所以尽量使用 Fragment.setArguments(Bundle bundle)方式来传递参数。

需要返回数据的选择界面中使用Fragment

首先我们要创建一个Fragment,在这个Fragment里面我们要返回数据,我们要申明一个接口,并且在需要接受数据的地方重写这个接口。

public class ChoseServerFragment extends Fragment {
    private ArrayAdapter<String> mAdapter;
    private String[] servers;
    public static String FRAGMENT = "com.example.lijing.diablo3armory.choseserverfragment";
    OnArticleSelectedListener mListener;
    public interface OnArticleSelectedListener {
        public void onServerSelected(String servername);
    }
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnArticleSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
        }
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.server_fragment, container, false);
        iniListView(v);
        return v;
    }

    private void iniListView(View v) {
        servers = getActivity().getResources().getStringArray(R.array.servers);
        ListView serverListView = (ListView)v.findViewById(R.id.choseServerListView);
        mAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_expandable_list_item_1,servers);
        serverListView.setAdapter(mAdapter);
        serverListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                String servername = servers[i];
                mListener.onServerSelected(servername);
            }
        });
    }
}

在代码中接口是这样申明的

OnArticleSelectedListener mListener;
public interface OnArticleSelectedListener {
    public void onServerSelected(String servername);
}

然后在onItemClick()中这样调用

mListener.onServerSelected(servername);

在这个Fragment里我们需要显示一个Layout

<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:gravity="center"
        android:text="@string/choseyourserver"
        android:textSize="20dp"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    <ListView
        android:id="@+id/choseServerListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    </ListView>
</LinearLayout>

这里显示了一个服务器列表,她的效果是这个样子的。

在这个App中,我是在Activity中调用的这个Fragment。首先要implements,这个接口。

public class MainActivity extends FragmentActivity
    implements ChoseServerFragment.OnArticleSelectedListener{

然后在重写这个接口在这个Activity里。

@Override
public void onServerSelected(String servername) {
    ChoseServerFragment fragment = (ChoseServerFragment)getSupportFragmentManager()
            .findFragmentByTag(ChoseServerFragment.FRAGMENT);
    if(fragment != null) {
        savePreferences(servername);
        ChoseServerFragment removeFragment = (ChoseServerFragment)getSupportFragmentManager().findFragmentByTag(ChoseServerFragment.FRAGMENT);
        getSupportFragmentManager().beginTransaction().remove(removeFragment);
        iniApp();
    }
}

这个Fragment,只需要重写这个接口就可以了,无论是在Activity或者Fragment里都可以。

小结

本章描述了第二种方式使用Fragment(第一种方式参看http://www.cnblogs.com/canglin/p/4439666.html)。大概有如下优点

  • UI具有更好的适应能力。
  • Bundle数据不会丢失。
  • 可重用性极高。
时间: 2024-10-09 23:23:50

Fragment在《暗黑3天梯榜》中使用的场景的相关文章

黑客榜中榜,超详细攻略!小白整理

黑客榜中榜第一期攻略 本人萌新小白一个,尽量把步骤都详细的整理出来,供新手参考. 先是第一期第一关 上图..... 这个是在未知的情况下要求通过各种方法获取到密码,然后登陆! 我使用的是火狐浏览器,使用F12快捷键,可以看到网页HTML源代码,分析源代码! 很多我都看不懂....... 分析一下能看懂的: if判断试 首先定义了一个全局变量"X"(至于"X"等于啥玩意我就不知道了,回头再研究) 下面就是判断 "X"是否等于 "go   

android开发之Fragment加载到一个Activity中

Fragments 是android3.0以后添加的.主要是为了方便android平板端的开发.方便适应不同大小的屏幕.此代码是为了最简单的Fragment的使用,往一个Activity中添加Fragment,主要涉及的知识点有:1.Fragment类的创建,2.Fragment的添加3.无UI的 Fragment的添加,根据Tag找回Fragment Fragment对应的Xml布局文件, <LinearLayout xmlns:android="http://schemas.andro

黑客游戏榜中榜 第一期writeup

[榜中榜 第一期传送门] 注:作者对游戏过程中右键点击进行了限制,下文所提到的"查看源代码",均通过在url头前加上"view-source:"来实现 第一题 查看源代码,可得密码 第二题 查看源代码,保存图片到桌面,用winhex打开,可得下一题链接 即,下一题链接为:http://www.cn-hack.cn/qs/or3.htm 第三题 url解码,可得下一题链接 第四题 各种sql注入都不起作用.留意跳转后的页面,查看源代码,可得flag. 第五题 通用密码

ActionScript3.0教你在影片剪辑中访问主场景中的变量

在ActionScript2.0中,影片剪辑访问主场景中的变量非常的简单,仅仅需要用一个带有_root的绝对路径即可. 然而在ActionScript3.0影片剪辑中访问主场景中的变量却没有那么容易,使用root将会报错.下面为大家介绍一种非常简单的方法来访问主场景中的变量. 方法如下: 1.在MC(影片剪辑实例名称)里定义一个变量father:Object; 2.在主场景代码中进行赋值 MC.father = this; 3.在影片剪辑里访问的时候就直接 father.变量名 就行.

cocos 中熟练运用场景的切换

在实际游戏运用中,一个场景是远远不够的,我们必须要掌握多个场景之间的切换. 场景切换时通过Director导演类来实现的,在cocos中定义了如下几种场景切换函数: 1,void runWithScene(Scene *scene).这是一个运行场景的函数,该函数的使用情况是当前没有场景正在运行,因为一次只能运行一个场景. 2,void replaceScene(Scene *scene).   这是第一种用来切换到另一个场景的函数,用一个新的场景来代替当前场景,当前场景则会被终端释放. 3,v

Android智能手机中各种音频场景下的audio data path

上一篇文章(Android智能手机上的音频浅析)说本篇将详细讲解Android智能手机中各种音频场景下的音频数据流向,现在我们就开始.智能手机中音频的主要场景有音频播放.音频录制.语音通信等.不同场景下的音频数据流向有很大差异,即使是同一场景,在不同的模式下音频数据流向也有所不同. 1,音频播放 Android系统audio框架中主要有三种播放模式:low latency playback.deep buffer playback和compressed offload playback. a)l

配置管理 ACM 在高可用服务 AHAS 流控降级组件中的应用场景

应用配置管理(Application Configuration Management,简称 ACM)是一款应用配置中心产品.基于ACM您可以在微服务.DevOps.大数据等场景下极大地减轻配置管理的工作量,同时保证配置的安全合规.ACM 有着丰富的使用场景,本文将介绍其在 AHAS 流控降级 中的应用. 什么是 AHAS 流控降级AHAS 流控降级 是面向分布式服务架构的专业流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统保护等多个维度帮助您保障服务的稳定性,同时提供强大的聚合监控

黑客游戏(黑客榜中榜攻略)

继续搞事情 地址: http://www.cn-hack.cn/qs/5.htm 查看源代码: 密码就是go 注意后面有很多空格 记得在上面那里复制好 说密码在图片中,把图片下载下来用notpad++直接打开: 所以就知道了,下一关是 .../or3.htm url解码就行了: http://www.cn-hack.cn/qs/4dfsa.htm 这里尝试了admin 123456 这样的弱口令 发现不对. 查看源代码也没什么,那就抓包看看. .../789.htm 说到通用密码想到: ' or

黑客榜中榜 第一期

找到一个好玩的小东西,记录一下打怪通关的过程. 游戏地址: http://www.cn-hack.cn/qs/5.htm 第一关 查看网页源码,找到一段js: 1 2 3 4 5 6 7 8 9 10 function PassConfirm() {     var x=document.password.pass.value     if (x=="go  ") {         alert("恭喜您,答对了,进入第二关!")         window.op