欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-02 15:11:58
fragment创建方式 fragment有两种使用方式:静态方式 和 动态方式。 1. 静态方式 第一步:先定义一个fragment子类。 publi...

fragment创建方式
fragment有两种使用方式:静态方式 和 动态方式。
1. 静态方式
第一步:先定义一个fragment子类。

public class examplefragment extends fragment {

  @override
  public view oncreateview(layoutinflater inflater, viewgroup container, 
      bundle savedinstancestate) {
    return inflater.inflate(r.layout.example_fragment, container, false);
  }  
}

说明:examplefragment是fragment的子类,它的布局定义是example_fragment.xml文件。
第二步:定义fragment子类对应的布局文件。

<?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="match_parent"
  android:orientation="horizontal" >

  <edittext android:id="@+id/edit_message"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:hint="@string/edit_message" />

  <button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onclick="sendmessage" />

</linearlayout>

说明:上面是example_fragment.xml的内容。
第三步:在需要用到该fragment的activity对应的布局中使用该fragment。
下面是引用fragment的activity的代码:

public class fragmentlayouttest extends activity
{
  /** called when the activity is first created. */
  @override
  public void oncreate(bundle savedinstancestate)
  {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main); 
  } 
}

下面是main.xml的内容:

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
  <textview
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/fragment_intro"
    />

  <fragment android:name="com.skw.fragmentlayouttest.examplefragment"
    android:id="@+id/frag_example"
    android:layout_weight="1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</linearlayout>

说明:在该布局文件中通过调用了先前自定义的examplefragment。
点击查看:静态方式的完整源码
2. 动态方式
重复"上面的第一步和第二步",实现一个fragment子类。
第三步:在需要用到该fragment的activity对应的布局中使用定义一个framelayout。

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

  <textview
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/fragment_intro"
    />

  <framelayout
    android:id="@+id/frag_example"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</linearlayout>

第四步:在activity中将fragment填充到framelayout中。

public class fragmentlayouttest extends activity {

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);

    // 获取fragmentmanager
    fragmentmanager fragmentmanager = getfragmentmanager();
    // 获取fragmenttransaction    
    fragmenttransaction fragmenttransaction = fragmentmanager.begintransaction();

    // 获取examplefragment
    examplefragment fragment = new examplefragment();
    // 将fragment添加到容器frag_example中
    fragmenttransaction.add(r.id.frag_example, fragment);
    fragmenttransaction.commit();
  }
}

preferencefragment使用说明
1. 创建配置文件
新建res/xml/preferences.xml,内容如下:

<preferencescreen xmlns:android="http://schemas.android.com/apk/res/android">

  <preferencecategory
    android:title="preferencecategory a">

    <!-- 
     (01) android:key是preferece的id
     (02) android:title是preferece的大标题
     (03) android:summary是preferece的小标题
     -->
    <checkboxpreference
      android:key="checkbox_preference"
      android:title="title_checkbox_preference"
      android:summary="summary_checkbox_preference" />

  </preferencecategory>

  <preferencecategory
    android:title="preferencecategory b">

    <!-- 
     android:dialogtitle是对话框的标题
     android:defaultvalue是默认值
     -->
    <edittextpreference
      android:key="edittext_preference"
      android:title="title_edittext_preference"
      android:summary="null" 
      android:dialogtitle="dialog_title_edittext_preference"
      android:defaultvalue="null" />

    <!-- 
     android:entries是列表中各项的说明
     android:entryvalues是列表中各项的值
     -->
    <listpreference 
      android:key="list_preference" 
      android:dialogtitle="choose font" 
      android:entries="@array/pref_font_types" 
      android:entryvalues="@array/pref_font_types_values" 
      android:summary="sans" 
      android:title="font" 
      android:defaultvalue="sans"/> 
  </preferencecategory>


  <preferencecategory
    android:title="preferencecategory c">

    <switchpreference
      android:key="switch_preferece"
      android:title="title_switch_preferece"
      android:defaultvalue="true" />

    <seekbarpreference
      android:key="seekbar_preference"
      android:title="title_seekbar_preference"
      android:max="100"
      android:defaultvalue="30" />

  </preferencecategory>

</preferencescreen>

说明:preferencefragment的组件很多,包括checkboxpreference, edittextpreference, listpreference, switchpreference, seekbarpreference, volumepreference等。这些组建的属性定义如下。
(01) android:key是preferece的id,它是preferece的唯一标识。
(02) android:title是preferece的大标题。
(03) android:summary是preferece的小标题。
(04) android:dialogtitle是对话框的标题。
(05) android:defaultvalue是默认值。
(06) android:entries是列表中各项的说明。
(07) android:entryvalues是列表中各项的值。
注意:switchpreference是api 14(android4.0)才支持的。所以,要想使用switchpreference的话,必须在manifest中定义apk支持的最小版本。
<uses-sdk android:minsdkversion="14" />
2. 自定义preferencefragment

public class prefsfragment extends preferencefragment 
  implements sharedpreferences.onsharedpreferencechangelistener, preference.onpreferenceclicklistener {
  private static final string tag = "##prefsfragment##";

  private static final string check_preference  = "checkbox_preference";
  private static final string edittext_preference = "edittext_preference";
  private static final string list_preference   = "list_preference";
  private static final string switch_preference  = "switch_preferece";
  private static final string seekbar_preference = "seekbar_preference";

  private preference medittext;
  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);

    // load the preferences from an xml resource
    addpreferencesfromresource(r.xml.preferences);

    medittext = (preference) findpreference(edittext_preference);
    medittext.setonpreferenceclicklistener(this);
  }

  @override
  public void onsharedpreferencechanged(sharedpreferences sharedpreferences, string key) {
    // set summary to be the user-description for the selected value
    preference connectionpref = findpreference(key);
    if (key.equals(check_preference)) {
      boolean checked = sharedpreferences.getboolean(key, false);
      log.d(tag, "checkbox: checked="+checked);
    } else if (key.equals(edittext_preference)) {
      string value = sharedpreferences.getstring(key, "");
      connectionpref.setsummary(value);
      log.d(tag, "edittext: value="+value);
    } else if (key.equals(list_preference)) {
      string value = sharedpreferences.getstring(key, "");
      connectionpref.setsummary(value);
      log.d(tag, "list: value="+value);
    } else if (key.equals(switch_preference)) {
      boolean checked = sharedpreferences.getboolean(key, false);
      log.d(tag, "switch: checked="+checked);
    } else if (key.equals(seekbar_preference)) {
      int value = sharedpreferences.getint(key, 0);
      log.d(tag, "seekbar: value="+value);
    } 
  }

  @override
  public boolean onpreferenceclick(preference preference) {
    sharedpreferences sharedpreferences = preference.getsharedpreferences();
    string value = sharedpreferences.getstring(preference.getkey(), "");
    log.d(tag, "onpreferenceclick: value="+value);

    return true;
  }

  @override
  public void onresume() {
    super.onresume();
    getpreferencemanager().getsharedpreferences().registeronsharedpreferencechangelistener(this);

  }

  @override
  public void onpause() {
    getpreferencemanager().getsharedpreferences().unregisteronsharedpreferencechangelistener(this);
    super.onpause();
  }
}

说明:preferencefragment中的每一项都是一个sharedpreferences对象,它们会像sharedpreferences存储在该apk的私有数据区。监听preferencefragment中的成员有多种方式,常用的两种就是:
(01) 监听数据的变化:通过实现sharedpreferences.onsharedpreferencechangelistener接口,来监听preferencefragment中每一项的数据变化。
(02) 监听点击事件:通过实现preference.onpreferenceclicklistener接口,来监听preferencefragment中每一项的点击动作。
3. 使用preferencefragment
前面已经定义好了一个preferencefragment。接下来,就可以实例化它的对象,并将其在activity中进行显示。

public class fragmenttest extends activity {

  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    //setcontentview(r.layout.main);

    getfragmentmanager().begintransaction().replace(android.r.id.content, 
        new prefsfragment()).commit(); 
  }
}