`
疯狂的犀牛
  • 浏览: 34680 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Fragment Arguments

阅读更多

 

一个Fragment可以通过两种方式进行配置,一个是Bundle类型参数,一个是layout中的属性。请看下面的例子:

1.主activity的布局文件

 

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:padding="4dip"
    android:gravity="center_horizontal"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:padding="4dip"
            android:layout_gravity="center_vertical|center_horizontal"
            android:gravity="top|center_horizontal"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/fragment_arguments_msg" />

    <LinearLayout android:orientation="horizontal" android:padding="4dip"
        android:layout_width="match_parent" android:layout_height="wrap_content">


        <fragment class="com.example.android.apis.app.FragmentArguments$MyFragment"
                android:id="@+id/embedded"
                android:layout_width="0px" android:layout_height="wrap_content"
                android:layout_weight="1"
                android:label="From Layout" />


        <FrameLayout
                android:id="@+id/created"
                android:layout_width="0px"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

    </LinearLayout>

</LinearLayout>
 

 

2.主Activity:

 

**
 * Demonstrates a fragment that can be configured through both Bundle arguments
 * and layout attributes.
 */
public class FragmentArguments extends Activity {

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

        if (savedInstanceState == null) {
            // First-time init; create fragment to embed in activity.
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            Fragment newFragment = MyFragment.newInstance("From Arguments");
            ft.add(R.id.created, newFragment);
            ft.commit();
        }
    }



    public static class MyFragment extends Fragment {
        CharSequence mLabel;

        /**
         * Create a new instance of MyFragment that will be initialized
         * with the given arguments.
         */
        static MyFragment newInstance(CharSequence label) {
            MyFragment f = new MyFragment();
            Bundle b = new Bundle();
            b.putCharSequence("label", label);
            f.setArguments(b);
            return f;
        }

        /**
         * Parse attributes during inflation from a view hierarchy into the
         * arguments we handle.
         */
        @Override public void onInflate(Activity activity, AttributeSet attrs,
                Bundle savedInstanceState) {
            super.onInflate(activity, attrs, savedInstanceState);

            TypedArray a = activity.obtainStyledAttributes(R.styleable.FragmentArguments);
            mLabel = a.getText(R.styleable.FragmentArguments_android_label);
            a.recycle();//不能忘记
        }

        /**
         * During creation, if arguments have been supplied to the fragment
         * then parse those out.
         */
        @Override public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            Bundle args = getArguments();
            if (args != null) {
                mLabel = args.getCharSequence("label", mLabel);
            }
        }

        /**
         * Create the view for this fragment, using the arguments given to it.
         */
        @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.hello_world, container, false);
            View tv = v.findViewById(R.id.text);
            ((TextView)tv).setText(mLabel != null ? mLabel : "(no label)");
           
            return v;
        }
    }

}

 

 

 3.MyFragment中的布局文件hello_world.xml

 

<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:gravity="center_vertical|center_horizontal"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="hello_world"/>
 
4.资源文件attr.xml
<?xml version="1.0" encoding="utf-8"?>
 

<resources>

    <!-- These are the attributes that we want to retrieve for
         app/FragmentArguments.java -->

    <declare-styleable name="FragmentArguments">
        <attr name="android:label" />
    </declare-styleable>

</resources>
 

 

总结:

这个示例展示了如何configure 一个Fragment, 其中展示了2种方法:
1. setArguments()方法

   这里要记住Fragment的Life cycle:   onAttach --- onCreate --- onCreateView --- onActivityCreated.

      首先, 在new 一个Fragment的同时设置Argument;
     然后,在这个Fragment类的onCreate中取出Argument,在onCreateView中对Argument进行设置。

2. 在view hierarchy的 inflation过程中解析出相关的attributes

以下是Fragment类说明中的一段话:

 

 The attributes of the <fragment> tag are used to control the LayoutParams provided when attaching the fragment's view to the parent container. They can also be parsed by the fragment in onInflate(Activity, AttributeSet, Bundle) as parameters. 


本例中定义了一个新的属性:android:label.
定义新属性的方法--- 在res/values/attr.xml中添加

<declare-styleable name="FragmentArguments">
       <attr name="android:label" />
</declare-styleable>

之后在layout xml文件中使用这个属性, 

<fragment class="com.example.android.apis.app.FragmentArguments$MyFragment" android:id="@+id/embedded" android:layout_width="0px" android:layout_height="wrap_content" android:layout_weight="1" android:label="@string/fragment_arguments_embedded" />


这样就可以在onInflate()方法中把属性值取出来,在onCreateView中进行处理了。

       

 

         
       /**
* Parse attributes during inflation from a view hierarchy into the
         * arguments we handle.
         */
        @Override public void onInflate(Activity activity, AttributeSet attrs,
                Bundle savedInstanceState) {
            super.onInflate(activity, attrs, savedInstanceState);
            TypedArray a = activity.obtainStyledAttributes(attrs,
                    R.styleable.FragmentArguments);
            mLabel = a.getText(R.styleable.FragmentArguments_android_label);
            a.recycle();//不要忘记
        }

 

 

 

0
0
分享到:
评论

相关推荐

    android编程权威指南2随书源码

    10_FragmentArguments 11_ViewPager 12_DateDialog 13_Toolbar 14_LocalDatabases 15_ImplicitIntents 16_CameraIntent 17_FragmentComposition 18_Assets 19_SoundPool 20_Themes 21_XMLDrawables 22_NerdLauncher ...

    Android Programming: The Big Nerd Ranch Guide, 3rd Edition

    Using Fragment Arguments Chapter 11. Using ViewPager Chapter 12. Dialogs Chapter 13. The Toolbar Chapter 14. SQLite Databases Chapter 15. Implicit Intents Chapter 16. Taking Pictures with Intents ...

    Android.Programming.The.Big.Nerd.Ranch.Guide.2nd.Edition.0134171454.epub

    Using Fragment Arguments Chapter 11. Using ViewPager Chapter 12. Dialogs Chapter 13. The Toolbar Chapter 14. SQLite Databases Chapter 15. Implicit Intents Chapter 16. Taking Pictures with Intents ...

    android navigation

    这样,无需手动管理Intent Extra或Fragment Arguments,降低了出错的可能性。 **导航组件的使用** 1. **创建Navigation Graph**:在Android Studio中,通过New &gt; Android Resource File &gt; Navigation Graph来创建。...

    fragment+viewpager实现不同fragment之间的通信

    2. 使用Bundle:通过设置Fragment的Arguments来传递基本类型或Parcelable对象,或者通过getArguments()获取。这种方法适用于简单数据的传递。 3. 使用EventBus:这是一个轻量级的发布/订阅事件总线,可以方便地在...

    Fragment的三个例子

    - **Arguments Bundle**:在创建Fragment时,可以通过setArguments(Bundle args)方法将数据封装到Bundle中,然后在Fragment的onCreate()或onCreateView()中通过getArguments()获取。这种方式适合传递简单的数据类型...

    fragment源码

    `为每个Tab添加Fragment,其中tabSpec用于设置Tab的显示信息,FragmentClass是Tab内容的Fragment类,arguments是传递给Fragment的参数。 - **处理点击事件**:通过TabHost的OnTabChangeListener监听用户点击事件,...

    Fragment数据传递

    首先,Fragment间的数据传递主要有两种方式:通过Arguments Bundle和通过接口回调。 1. **Arguments Bundle**:在创建Fragment实例时,我们可以使用setArguments()方法传递数据。Arguments Bundle是一个Bundle对象...

    Android fragment demo

    1. **Arguments**:在添加或替换Fragment时,可以通过Bundle传递参数,实现在父Activity或兄弟Fragment间的通信。 2. **Interface回调**:定义一个接口,Fragment通过实现这个接口来回调Activity的方法,实现双向...

    多个 fragment 交互 通讯录

    5. **Arguments Bundle**: 为了在创建Fragment时传入参数,可以使用setArguments(Bundle)方法,并在Fragment内部通过getArguments()获取。 6. **Fragment的back stack**: 可以使用addToBackStack(String)在添加...

    Fragment的最佳实践-一个简易版的新闻应用

    3. **Arguments Bundle**:传递数据给Fragment通常使用`setArguments(Bundle args)`方法,通过Bundle对象存储键值对。在Fragment内部,可以通过`getArguments()`获取传入的数据。 4. **Fragment通信**:Fragment与...

    Fragment与Activity使用Bundle传递数据

    2. **设置Intent或Arguments**:如果从Activity到Fragment传递数据,需要在创建Fragment实例时将Bundle作为参数传递给Fragment的构造函数,或者调用`setArguments(Bundle)`方法。如果是Activity间的跳转,将Bundle...

    Fragment与Activity传递数据

    2. **设置Arguments**:通过setArguments(Bundle)方法将Bundle对象传递给Fragment。 3. **在Activity中获取数据**:在Activity中,通过getArguments()方法获取Fragment传递过来的Bundle,然后从中取出数据。 示例...

    1_fragment入门

    4. Bundle和Arguments:Fragment可以通过Bundle对象传递数据,这在创建Fragment实例时通过setArguments(Bundle)完成,然后在Fragment内部通过getArguments()获取。 在提供的源代码中,你可能会看到如何在实际项目中...

    Android:Android开发大书呆子牧场

    安卓 Android开发大书呆子牧场 ... 犯罪意图应用程序(约10章,大篇幅)MVC体系结构继续使用Fragments,RecyclerView,约束布局,DialogFragments,小部件,Fragment Arguments,ViewPager,Impicit Intent

    Fragment间的交互

    1. **Arguments Bundle**: 在添加或替换Fragment时,可以传递一个Bundle对象,用于存储数据。接收方Fragment在onCreate()或onCreateView()中可以通过getArguments()获取这些数据。 2. **Interface回调**: 创建一个...

    安卓Android源码——Fragment例子.zip

    4. **Arguments**:可以通过Bundle传递数据给Fragment,在Fragment的onCreate()或onCreateView()中解析这些参数。 ``` Bundle args = getArguments(); if (args != null) { String param1 = args.getString(...

    Fragment之间通信

    在Fragment的onCreate()或onCreateView()中,可以从savedInstanceState或arguments中恢复数据。 4. **事件总线**:使用EventBus或GreenDao等事件总线库可以简化Fragment之间的通信。发布者Fragment发送事件,订阅者...

    FragmentTest

    - **Arguments Bundle**:在创建Fragment时,可以通过`setArguments(Bundle)`传递数据。这些数据可以在Fragment的`onCreate()`或`onCreateView()`中通过`getArguments()`获取。 - **Interface回调**:当需要在...

    ViewPager+RadioGroup+Fragment仿微信导航功能实现

    这可以通过设置和获取Arguments Bundle、使用接口回调或者LiveData等手段实现。此外,为了保持Fragment的状态,需要正确处理onSaveInstanceState和onCreateView方法。 **7. UI设计和优化** 在实现功能的同时,我们...

Global site tag (gtag.js) - Google Analytics