Android中的Fragment类使用进阶

0、回顾
Fragment 代表 Activity 当中的一项操作或一部分用户界面。 一个 Activity 中的多个 Fragment 可以组合在一起,形成一个多部分拼接而成的用户界面组件,并可在多个 Activity 中复用。一个 Fragment 可被视为 Activity 中一个模块化的部分, 它拥有自己的生命周期,并接收自己的输入事件,在 Activity 运行过程中可以随时添加或移除它 (有点类似“子 Activity”,可在不同的 Activity 中重用)。

Fragment 必须嵌入某个 Activity 中,其生命周期直接受到宿主 Activity 生命周期的影响。 例如,当 Activity 被暂停(Paused)时,其内部所有的 Fragment 也都会暂停。 而当 Activity 被销毁时,它的 Fragment 也都会被销毁。 不过,在 Activity 运行期间(生命周期状态处于 恢复(Resumed) 状态时),每一个 Fragment 都可以被独立地操作,比如添加或移除。 在执行这些操作事务时,还可以将它们加入该 Activity 的回退栈(Back Stack)中 — Activity 回退栈的每个入口就是一条操作过的 Fragment 事务记录。 回退堆栈使得用户可以通过按下 回退(Back) 键来回退 Fragment 事务(后退一步)。

当把 Fragment 加入 Activity 布局(Layout) 后,它位于 Activity View 层次架构(Hierarchy)的某个 ViewGroup 里,且拥有自己的 View 布局定义。 通过在 Activity 的 Layout 文件中声明 <fragment> 元素,可以在 Layout 中添加一个 Fragment。 也可以用程序代码在已有的 ViewGroup 中添加一个 Fragment。 不过, Fragment 并不一定非要是 Activity 布局的一部分,它也可以没有自己的界面,而是用作 Activity 的非可视化工作组件。

1、概述
相信大家对Fragment的都不陌生,对于Fragment的使用,一方面Activity需要在布局中为Fragment安排位置,另一方面需要管理好Fragment的生命周期。Activity中有个FragmentManager,其内部维护fragment队列,以及fragment事务的回退栈。
一般情况下,我们在Activity里面会这么添加Fragment:

public class MainActivity extends FragmentActivity
{ 

  private ContentFragment mContentFragment ;  

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

    FragmentManager fm = getSupportFragmentManager();
    mContentFragment = (ContentFragment) fm.findFragmentById(R.id.id_fragment_container); 

    if(mContentFragment == null )
    {
      mContentFragment = new ContentFragment();
      fm.beginTransaction().add(R.id.id_fragment_container,mContentFragment).commit();
    } 

  } 

}

针对上面代码,问两个问题:
(1)为什么需要判null呢?
主要是因为,当Activity因为配置发生改变(屏幕旋转)或者内存不足被系统杀死,造成重新创建时,我们的fragment会被保存下来,但是会创建新的FragmentManager,新的FragmentManager会首先会去获取保存下来的fragment队列,重建fragment队列,从而恢复之前的状态。
(2)add(R.id.id_fragment_container,mContentFragment)中的布局的id有何作用?
一方面呢,是告知FragmentManager,此fragment的位置;另一方面是此fragment的唯一标识;就像我们上面通过fm.findFragmentById(R.id.id_fragment_container)查找~~
好了,简单回顾了一下基本用法,具体的还请参考上面的博客或者其他资料,接下来,介绍一些使用的意见~~

2、Fragment Arguments
下面描述一个简单的场景,比如我们某个按钮触发Activity跳转,需要通过Intent传递参数到目标Activity的Fragment中,那么此Fragment如何获取当前的Intent的值呢?
有哥们会说,这个简单?看我的代码(问题代码):

public class ContentFragment extends Fragment
{ 

  private String mArgument ;
  public static final String ARGUMENT ="argument";
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState); 

    mArgument = getActivity().getIntent().getStringExtra(ARGUMENT); 

  }

我们直接在Fragment的onCreate中,拿到宿主Activty,宿主Activity中肯定能通过getIntent拿到Intent,然后通过get方法,随意拿参数~~
这么写,功能上是实现了,但是呢?存在一个大问题:我们用Fragment的一个很大的原因,就是为了复用。你这么写,相当于这个Fragment已经完全和当前这个宿主Activity绑定了,复用直接废了~~~所以呢?我们换种方式,推荐使用arguments来创建Fragment。

public class ContentFragment extends Fragment
{ 

  private String mArgument;
  public static final String ARGUMENT = "argument"; 

  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    // mArgument = getActivity().getIntent().getStringExtra(ARGUMENT);
    Bundle bundle = getArguments();
    if (bundle != null)
      mArgument = bundle.getString(ARGUMENT); 

  } 

  /**
   * 传入需要的参数,设置给arguments
   * @param argument
   * @return
   */
  public static ContentFragment newInstance(String argument)
  {
    Bundle bundle = new Bundle();
    bundle.putString(ARGUMENT, argument);
    ContentFragment contentFragment = new ContentFragment();
    contentFragment.setArguments(bundle);
    return contentFragment;
  }

给Fragment添加newInstance方法,将需要的参数传入,设置到bundle中,然后setArguments(bundle),最后在onCreate中进行获取;
这样就完成了Fragment和Activity间的解耦。当然了这里需要注意:
setArguments方法必须在fragment创建以后,添加给Activity前完成。千万不要,首先调用了add,然后设置arguments。

3、Fragment的startActivityForResult
依旧是一个简单的场景:两个Fragment,一个展示文章列表的Fragment(叫做ListTitleFragment),一个显示详细信息的Fragment(叫做:ContentFragment),当然了,这两个Fragment都有其宿主Activity。
现在,我们点击列表Fragment中的列表项,传入相应的参数,去详细信息的Fragment展示详细的信息,在详细信息页面,用户可以进行点评,当用户点击back以后,我们以往点评结果显示在列表的Fragment对于的列表项中;
也就是说,我们点击跳转到对应Activity的Fragment中,并且希望它能够返回参数,那么我们肯定是使用Fragment.startActivityForResult ;
在Fragment中存在startActivityForResult()以及onActivityResult()方法,但是呢,没有setResult()方法,用于设置返回的intent,这样我们就需要通过调用getActivity().setResult(ListTitleFragment.REQUEST_DETAIL, intent);。
详细代码:
ListTitleFragment

public class ListTitleFragment extends ListFragment
{ 

  public static final int REQUEST_DETAIL = 0x110;
  private List<String> mTitles = Arrays.asList("Hello", "World", "Android");
  private int mCurrentPos ;
  private ArrayAdapter<String> mAdapter ;  

  @Override
  public void onActivityCreated(Bundle savedInstanceState)
  {
    super.onActivityCreated(savedInstanceState);
    setListAdapter(mAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, mTitles));
  } 

  @Override
  public void onListItemClick(ListView l, View v, int position, long id)
  {
    mCurrentPos = position ;
    Intent intent = new Intent(getActivity(),ContentActivity.class);
    intent.putExtra(ContentFragment.ARGUMENT, mTitles.get(position));
    startActivityForResult(intent, REQUEST_DETAIL);
  } 

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data)
  {
    Log.e("TAG", "onActivityResult");
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQUEST_DETAIL)
    {
      mTitles.set(mCurrentPos, mTitles.get(mCurrentPos)+" -- "+data.getStringExtra(ContentFragment.RESPONSE));
      mAdapter.notifyDataSetChanged();
    }
  }
}

ContentFragment

public class ContentFragment extends Fragment
{ 

  private String mArgument;
  public static final String ARGUMENT = "argument";
  public static final String RESPONSE = "response"; 

  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    Bundle bundle = getArguments();
    if (bundle != null)
    {
      mArgument = bundle.getString(ARGUMENT);
      Intent intent = new Intent();
      intent.putExtra(RESPONSE, "good");
      getActivity().setResult(ListTitleFragment.REQUEST_DETAIL, intent);
    } 

  } 

  public static ContentFragment newInstance(String argument)
  {
    Bundle bundle = new Bundle();
    bundle.putString(ARGUMENT, argument);
    ContentFragment contentFragment = new ContentFragment();
    contentFragment.setArguments(bundle);
    return contentFragment;
  } 

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState)
  {
    Random random = new Random();
    TextView tv = new TextView(getActivity());
    tv.setText(mArgument);
    tv.setGravity(Gravity.CENTER);
    tv.setBackgroundColor(Color.argb(random.nextInt(100),
        random.nextInt(255), random.nextInt(255), random.nextInt(255)));
    return tv;
  }
}

贴出了两个Fragment的代码,可以看到我们在ListTitleFragment.onListItemClick,使用startActivityForResult()跳转到目标Activity,在目标Activity的Fragment(ContentFragment)中获取参数,然后调用getActivity().setResult(ListTitleFragment.REQUEST_DETAIL, intent);进行设置返回的数据;最后在ListTitleFragment.onActivityResult()拿到返回的数据进行回显;
为大家以后在遇到类似问题时,提供了解决方案;也说明了一个问题:fragment能够从Activity中接收返回结果,但是其自设无法产生返回结果,只有Activity拥有返回结果。
接下来我要贴一下,这两个Fragment的宿主Activity:
ListTitleActivity

public class ListTitleActivity extends FragmentActivity
{ 

  private ListTitleFragment mListFragment; 

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_single_fragment); 

    FragmentManager fm = getSupportFragmentManager();
    mListFragment = (ListTitleFragment) fm.findFragmentById(R.id.id_fragment_container); 

    if(mListFragment == null )
    {
      mListFragment = new ListTitleFragment();
      fm.beginTransaction().add(R.id.id_fragment_container,mListFragment).commit();
    } 

  }
}

ContentActivity:

public class ContentActivity extends FragmentActivity
{ 

  private ContentFragment mContentFragment; 

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_single_fragment); 

    FragmentManager fm = getSupportFragmentManager();
    mContentFragment = (ContentFragment) fm.findFragmentById(R.id.id_fragment_container); 

    if(mContentFragment == null )
    {
      String title = getIntent().getStringExtra(ContentFragment.ARGUMENT);
      mContentFragment = ContentFragment.newInstance(title);
      fm.beginTransaction().add(R.id.id_fragment_container,mContentFragment).commit();
    } 

  }
}

有没有发现两个Activity中的代码极其的类似,且使用了同一个布局文件:
activity_single_fragment.xml

<RelativeLayout 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:id="@+id/id_fragment_container"
> 

</RelativeLayout>

为什么要贴这Acticity的代码呢?因为我们项目中,如果原则上使用Fragment,会发现大量类似的代码,那么我们就可以抽象一个Activity出来,托管我们的Single Fragment。

4、SingleFragmentActivity
于是抽象出来的Activity的代码为:

package com.example.demo_zhy_23_fragments; 

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

public abstract class SingleFragmentActivity extends FragmentActivity
{
  protected abstract Fragment createFragment(); 

  @Override
  protected void onCreate(Bundle savedInstanceState)
  { 

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

    FragmentManager fm = getSupportFragmentManager();
    Fragment fragment =fm.findFragmentById(R.id.id_fragment_container); 

    if(fragment == null )
    {
      fragment = createFragment() ; 

      fm.beginTransaction().add(R.id.id_fragment_container,fragment).commit();
    }
  } 

}

那么,有了这个SingleFragmentActivity,我们的ContentActivity和ListTitleActivity也能大变身了~

package com.example.demo_zhy_23_fragments; 

import android.support.v4.app.Fragment; 

public class ContentActivity extends SingleFragmentActivity
{
  private ContentFragment mContentFragment; 

  @Override
  protected Fragment createFragment()
  {
    String title = getIntent().getStringExtra(ContentFragment.ARGUMENT); 

    mContentFragment = ContentFragment.newInstance(title);
    return mContentFragment;
  }
}
package com.example.demo_zhy_23_fragments; 

import android.support.v4.app.Fragment; 

public class ListTitleActivity extends SingleFragmentActivity
{
  private ListTitleFragment mListFragment; 

  @Override
  protected Fragment createFragment()
  {
    mListFragment = new ListTitleFragment();
    return mListFragment;
  }
}

是不是简洁很多,相信优先使用Fragment的项目,类似的Activity非常多,使用SingleFragmentActivity来简化你的代码吧~~
好了,此代码是来自文章开始推荐的书中的,再次推荐一下~~。

5、FragmentPagerAdapter与FragmentStatePagerAdapter
相信这两个PagerAdapter的子类,大家都不陌生吧~~自从Fragment问世,使用ViewPager再结合上面任何一个实例的制作APP主页的案例特别多~~~
那么这两个类有何区别呢?
主要区别就在与对于fragment是否销毁,下面细说:
(1)FragmentPagerAdapter:对于不再需要的fragment,选择调用detach方法,仅销毁视图,并不会销毁fragment实例。
(2)FragmentStatePagerAdapter:会销毁不再需要的fragment,当当前事务提交以后,会彻底的将fragmeng从当前Activity的FragmentManager中移除,state标明,销毁时,会将其onSaveInstanceState(Bundle outState)中的bundle信息保存下来,当用户切换回来,可以通过该bundle恢复生成新的fragment,也就是说,你可以在onSaveInstanceState(Bundle outState)方法中保存一些数据,在onCreate中进行恢复创建。
如上所说,使用FragmentStatePagerAdapter当然更省内存,但是销毁新建也是需要时间的。一般情况下,如果你是制作主页面,就3、4个Tab,那么可以选择使用FragmentPagerAdapter,如果你是用于ViewPager展示数量特别多的条目时,那么建议使用FragmentStatePagerAdapter。
篇幅原因,具体的案例就不写了,大家自行测试。

6、Fragment间的数据传递
上面3中,我们展示了,一般的两个Fragment间的数据传递。
那么还有一种比较特殊的情况,就是两个Fragment在同一个Activity中:例如,点击当前Fragment中按钮,弹出一个对话框(DialogFragment),在对话框中的操作需要返回给触发的Fragment中,那么如何数据传递呢?对于对话框的使用推荐:Android 官方推荐 : DialogFragment 创建对话框
我们继续修改我们的代码:现在是ListTitleFragment , ContentFragment , 添加一个对话框:EvaluateDialog,用户点击ContentFragment 内容时弹出一个评价列表,用户选择评价。
现在我们的关注点在于:ContentFragment中如何优雅的拿到EvaluateDialog中返回的评价:
记住我们在一个Activity中,那么肯定不是使用startActivityForResult;但是我们返回的数据,依然在onActivityResult中进行接收。
好了看代码:
ContentFragment

public class ContentFragment extends Fragment
{ 

  private String mArgument;
  public static final String ARGUMENT = "argument";
  public static final String RESPONSE = "response";
  public static final String EVALUATE_DIALOG = "evaluate_dialog";
  public static final int REQUEST_EVALUATE = 0X110; 

  //... 

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState)
  {
    Random random = new Random();
    TextView tv = new TextView(getActivity());
    ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    tv.setLayoutParams(params);
    tv.setText(mArgument);
    tv.setGravity(Gravity.CENTER);
    tv.setBackgroundColor(Color.argb(random.nextInt(100),
        random.nextInt(255), random.nextInt(255), random.nextInt(255)));
    // set click
    tv.setOnClickListener(new OnClickListener()
    { 

      @Override
      public void onClick(View v)
      {
        EvaluateDialog dialog = new EvaluateDialog();
        //注意setTargetFragment
        dialog.setTargetFragment(ContentFragment.this, REQUEST_EVALUATE);
        dialog.show(getFragmentManager(), EVALUATE_DIALOG);
      }
    });
    return tv;
  } 

  //接收返回回来的数据
  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data)
  {
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == REQUEST_EVALUATE)
    {
      String evaluate = data
          .getStringExtra(EvaluateDialog.RESPONSE_EVALUATE);
      Toast.makeText(getActivity(), evaluate, Toast.LENGTH_SHORT).show();
      Intent intent = new Intent();
      intent.putExtra(RESPONSE, evaluate);
      getActivity().setResult(Activity.REQUEST_OK, intent);
    } 

  }
}

删除了一些无关代码,注意看,我们在onCreateView中为textview添加了click事件,用于弹出我们的dialog,注意一行代码:
dialog.setTargetFragment(ContentFragment.this, REQUEST_EVALUATE);
我们调用了Fragment.setTargetFragment ,这个方法,一般就是用于当前fragment由别的fragment启动,在完成操作后返回数据的,符合我们的需求吧~~~注意,这句很重要。
接下来看EvaluateDialog代码:

package com.example.demo_zhy_23_fragments; 

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.DialogFragment; 

public class EvaluateDialog extends DialogFragment
{
  private String[] mEvaluteVals = new String[] { "GOOD", "BAD", "NORMAL" };
  public static final String RESPONSE_EVALUATE = "response_evaluate"; 

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState)
  {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    builder.setTitle("Evaluate :").setItems(mEvaluteVals,
        new OnClickListener()
        {
          @Override
          public void onClick(DialogInterface dialog, int which)
          {
            setResult(which);
          }
        });
    return builder.create();
  } 

  // 设置返回数据
  protected void setResult(int which)
  {
    // 判断是否设置了targetFragment
    if (getTargetFragment() == null)
      return; 

    Intent intent = new Intent();
    intent.putExtra(RESPONSE_EVALUATE, mEvaluteVals[which]);
    getTargetFragment().onActivityResult(ContentFragment.REQUEST_EVALUATE,
        Activity.RESULT_OK, intent); 

  }
}

重点就是看点击后的setResult了,我们首先判断是否设置了targetFragment,如果设置了,意味我们要返回一些数据到targetFragment。
我们创建intent封装好需要传递数据,最后手动调用onActivityResult进行返回数据~~
最后我们在ContentFragment的onActivityResult接收即可。

ok,终于把这些tips贯穿到一起了,到此我们的Fragment的一些建议的用法就结束了~~~那么,最后提供下源码,也顺便贴个效果图:

(0)

相关推荐

  • Android中ViewPager和Fragment的使用

    小案例 XML中 <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager> 创建Fragment fragments = new Arr

  • 详解Android应用中DialogFragment的基本用法

    DialogFragment的基本用法 1. 创建DialogFragment public class DialogA extends DialogFragment implements DialogInterface.OnClickListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder

  • Android 动态添加Fragment的实例代码

    1.fragment1布局及代码 布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width=&quo

  • Android程序开发之Fragment实现底部导航栏实例代码

    流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏. 说明 IDE:AS,Android studio; 模拟器:genymotion; 实现的效果,见下图. 具体实现 为了讲明白这个实现过程,我们贴出来的代码多一写,这样更方便理解 [最后还会放出完整的代码实现] .看上图的界面做的比较粗糙,但实现过程的骨架都具有了,想要更完美的设计,之后自行完善吧 ^0^. 布局 通过观察上述效果图,发现任意一个选项页面都有三部分组成: 顶部去除ActionBar后的标题栏: 中间一个Fragment

  • Android中Fragment子类及其PreferenceFragment的创建过程演示

    Fragment创建方式 Fragment有两种使用方式:静态方式 和 动态方式. 1. 静态方式 第一步:先定义一个Fragment子类. public class ExampleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.infla

  • Android应用中使用Fragment组件的一些问题及解决方案总结

    Fragment的主要意义就是提供与Activity绑定的生命周期回调. Fragment不一定要向Activity的视图层级中添加View. 当某个模块需要获得Activity的生命周期回调的时候,就可以考虑通过Fragment来实现. 例如: DialogFragment, 调用show方法来显示一个Dialog(这个一个子Window,并不在Activity的视图层级中),当旋屏时,DialogFragment利用onDestroyView回调来dismiss Dialog,然后Activ

  • 实例探究Android开发中Fragment状态的保存与恢复方法

    我们都知道,类似 Activity, Fragment 有 onSaveInstanceState() 回调用来保存状态. 在Fragment里面,利用onSaveInstanceState保存数据,并可在onActivityCreated里面恢复数据. public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ... if (savedInsta

  • Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果

    BottomBar BottomBar是Github上的一个开源框架,因为从1.3.3开始不支持fragments了,要自己配置,弄了很久,不管是app的fragment还是V4 的程序总是总是闪退.于是就用这种方式实现了,效果还不错.github有详细说明,多余的就不说了. 这个roughike是这个项目的所有者(大神致敬). 我用的是Android studio开发,fragment全部导的V4的包(以为最开始就支持的是v4的,后面也支持了app.fragment). 首先是dependen

  • Android App中使用ListFragment的实例教程

    ListFragment继承于Fragment.因此它具有Fragment的特性,能够作为activity中的一部分,目的也是为了使页面设计更加灵活. 相比Fragment,ListFragment的内容是以列表(list)的形式显示的.ListFragment的布局默认包含一个ListView.因此,在ListFragment对应的布局文件中,必须指定一个 android:id 为 "@android:id/list" 的ListView控件! ListFragment基础使用 下面

  • Android中的Fragment类使用进阶

    0.回顾 Fragment 代表 Activity 当中的一项操作或一部分用户界面. 一个 Activity 中的多个 Fragment 可以组合在一起,形成一个多部分拼接而成的用户界面组件,并可在多个 Activity 中复用.一个 Fragment 可被视为 Activity 中一个模块化的部分, 它拥有自己的生命周期,并接收自己的输入事件,在 Activity 运行过程中可以随时添加或移除它 (有点类似"子 Activity",可在不同的 Activity 中重用). Fragm

  • Android 中ActionBar+fragment实现页面导航的实例

    Android 中ActionBar+fragment实现页面导航的实例 为保证android2.0以上均能运行,使用support.v7库下的actionbar及fragment 继承自AppCompatActivity(ActionBarActivity已过时)使用getSupportActionBar()得到ActionBar, ActionBar.Tab,这里Tab必须设置监听,在监听中实现Fragment的切换. 这里重点提一下,Theme主题一定要适配,因为我使用的是AppCompa

  • 使用 Lambda 取代 Android 中的匿名类

    Lambda是第十一个希腊字母,大写Λ,小写λ,额,跑题了-Lambda表达式 是Java8的新特性之一: Lambda表达式 函数式接口 流API 默认方法 新的Date Time API Lambda表达式 取代了匿名类 ,取消了模板,允许用函数式风格编写代码. 由于最近接触了RxJava,遇到了Lambda,立马就喜欢上了~所以就学习了一下. 本文主要介绍一下Lambda在Android中替代匿名类的部分使用场景. 在Android中使用Lambda gradle-retrolambda

  • android 中viewpager+fragment仿微信底部TAG完美渐变

    viewpager+fragment仿微信底部TAG完美渐变,在图片渐变的同时字的颜色也在变,注意,是渐变哦! 效果图: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:zhy="http://schemas.android.com/apk/res/com.Sing.weixin" xmlns:tools="

  • Android中给fragment写入参数的轻量开发包FragmentArgs简介

    Android开发有时候会令人头痛.你不得不为诸如建立fragment这样简单的事情写很多代码.幸运的是java支持一个强大的工具:注释处理器(Annotation Processors). Fragment的问题是你不得不设置很多参数,从而让它正常运行.很多android开发新手通常这样写: 复制代码 代码如下: public class MyFragment extends Fragment { private int id; private String title; public sta

  • 详解Android中通过Intent类实现组件间调用的方法

    Intent是Android中用来调用其它组件的类,通过Intent,我们可以非常方便的调用Activity,Broadcast Receiver和Service. Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent); 上面这段代码可以用来调用第三方的Activity(启动第三方浏览器来打开百度首页

  • 实例讲解Android中ViewPager组件的一些进阶使用技巧

    我们经常看到使用了ViewPager的App,在每页上面都会有一个滑块来标志当前处于哪一页.在PagerView包里有android.support.v4.view.PagerTitleStrip和android.support.v4.view.PagerTabStrip两个组件,可以在布局文件中,作为ViewPager的子标签,并设定相对与ViewPager的位置(比如顶部).但这两个组件都很丑,并且标题会随着页面一起滑动,所以一般都不用. 其实实现一个滑块标志当前页面也很简单,大概需要两步:

  • Android中使用BitmapShader类来制作各种图片的圆角

    public   BitmapShader(Bitmap bitmap,Shader.TileMode tileX,Shader.TileMode tileY) 调用这个类来产生一个画有一个位图的渲染器(Shader). bitmap:在渲染器内使用的位图 (1)tileX:The tiling mode for x to draw the bitmap in.   在位图上X方向花砖模式 (2)tileY:The tiling mode for y to draw the bitmap in.

  • Android中使用DownloadManager类来管理数据下载的教程

    从Android 2.3(API level 9)开始Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作.Download Manager处理HTTP连接并监控连接中的状态变化以及系统重启来确保每一个下载任务顺利完成. 在大多数涉及到下载的情况中使用Download Manager都是不错的选择,特别是当用户切换不同的应用以后下载需要在后台继续进行,以及当下载任务顺利完成非常重要的情况(DownloadManager对于断点续传功能支

  • ANDROID中使用VIEWFLIPPER类实现屏幕切换(关于坐标轴的问题已补充更改)

    屏幕切换指的是在同一个Activity内屏幕间的切换,ViewFlipper继承了Framelayout类,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果.如下动图: 该类有如下几个和动画相关的函数: setInAnimation:设置View进入屏幕时候使用的动画,该函数有两个版本,一个接受单个参数,类型为android.view.animation.Animation:一个接受两个参数,类型为Context和int,分别为Context对象和定义An

随机推荐