ApiDemos之Fragment使用案例

来源:互联网 发布:安卓版手机编程工具 编辑:程序博客网 时间:2024/05/22 17:04

转载请注明出处:http://blog.csdn.net/droyon/article/details/8648169

1、FragmentDialogActivity.java

/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.app;import com.example.android.apis.R;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.DialogFragment;import android.content.DialogInterface;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;/** * Demonstrates how to show an AlertDialog that is managed by a Fragment. */public class FragmentAlertDialog extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.fragment_dialog);        View tv = findViewById(R.id.text);        ((TextView)tv).setText("Example of displaying an alert dialog with a DialogFragment");        // Watch for button clicks.        Button button = (Button)findViewById(R.id.show);        button.setOnClickListener(new OnClickListener() {            public void onClick(View v) {                showDialog();            }        });    }//BEGIN_INCLUDE(activity)    void showDialog() {        DialogFragment newFragment = MyAlertDialogFragment.newInstance(                R.string.alert_dialog_two_buttons_title);        newFragment.show(getFragmentManager(), "dialog");    }    public void doPositiveClick() {        // Do stuff here.        Log.i("FragmentAlertDialog", "Positive click!");    }        public void doNegativeClick() {        // Do stuff here.        Log.i("FragmentAlertDialog", "Negative click!");    }//END_INCLUDE(activity)    //BEGIN_INCLUDE(dialog)    public static class MyAlertDialogFragment extends DialogFragment {        public static MyAlertDialogFragment newInstance(int title) {            MyAlertDialogFragment frag = new MyAlertDialogFragment();            Bundle args = new Bundle();            args.putInt("title", title);            frag.setArguments(args);            return frag;        }                @Override        public Dialog onCreateDialog(Bundle savedInstanceState) {            int title = getArguments().getInt("title");                        return new AlertDialog.Builder(getActivity())                    .setIcon(R.drawable.alert_dialog_icon)                    .setTitle(title)                    .setPositiveButton(R.string.alert_dialog_ok,                        new DialogInterface.OnClickListener() {                            public void onClick(DialogInterface dialog, int whichButton) {                                ((FragmentAlertDialog)getActivity()).doPositiveClick();                            }                        }                    )                    .setNegativeButton(R.string.alert_dialog_cancel,                        new DialogInterface.OnClickListener() {                            public void onClick(DialogInterface dialog, int whichButton) {                                ((FragmentAlertDialog)getActivity()).doNegativeClick();                            }                        }                    )                    .create();        }    }//END_INCLUDE(dialog)}
弹出对话框,不一定需要使用AlertDialog,上述案例代码主要讲述了如何使用DialogFragment弹出对话框。

重点在于:

DialogFragment newFragment = MyAlertDialogFragment.newInstance(                R.string.alert_dialog_two_buttons_title);        newFragment.show(getFragmentManager(), "dialog");
2、FragmentArguments.java

fragment_argument.xml

<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2011 The Android Open Source Project     Licensed under the Apache License, Version 2.0 (the "License");     you may not use this file except in compliance with the License.     You may obtain a copy of the License at          http://www.apache.org/licenses/LICENSE-2.0     Unless required by applicable law or agreed to in writing, software     distributed under the License is distributed on an "AS IS" BASIS,     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.     See the License for the specific language governing permissions and     limitations under the License.--><!-- Top-level content view for the simple fragment sample. --><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"><!-- BEGIN_INCLUDE(from_attributes) -->        <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" /><!-- END_INCLUDE(from_attributes) -->        <FrameLayout                android:id="@+id/created"                android:layout_width="0px"                android:layout_height="wrap_content"                android:layout_weight="1" />    </LinearLayout></LinearLayout>
FragmentArgument.java

/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.app;import com.example.android.apis.R;import android.app.Activity;import android.app.Fragment;import android.app.FragmentTransaction;import android.content.res.TypedArray;import android.os.Bundle;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;/** * Demonstrates a fragment that can be configured through both Bundle arguments * and layout attributes. */public class FragmentArguments extends Activity {//BEGIN_INCLUDE(create)    @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();        }    }//END_INCLUDE(create)//BEGIN_INCLUDE(fragment)    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(attrs,                    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)");            tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));            return v;        }    }//END_INCLUDE(fragment)}
这段代码,通过在代码中启动fragment以及在layout文件夹下的xml文件中配置fragment两种方式,展示如何使用fragment。

在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" />

在代码中启动:

FragmentTransaction ft = getFragmentManager().beginTransaction();            Fragment newFragment = MyFragment.newInstance("From Arguments");            ft.add(R.id.created, newFragment);            ft.commit();

3、FragmentContextMenu.java

/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.app;import com.example.android.apis.R;import android.app.Activity;import android.app.Fragment;import android.os.Bundle;import android.util.Log;import android.view.ContextMenu;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.view.ContextMenu.ContextMenuInfo;/** * Demonstration of displaying a context menu from a fragment. */public class FragmentContextMenu extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // Create the list fragment and add it as our sole content.        ContextMenuFragment content = new ContextMenuFragment();        getFragmentManager().beginTransaction().add(android.R.id.content, content).commit();    }    public static class ContextMenuFragment extends Fragment {        @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container,                Bundle savedInstanceState) {            View root = inflater.inflate(R.layout.fragment_context_menu, container, false);            registerForContextMenu(root.findViewById(R.id.long_press));            return root;        }        @Override        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {            super.onCreateContextMenu(menu, v, menuInfo);            menu.add(Menu.NONE, R.id.a_item, Menu.NONE, "Menu A");            menu.add(Menu.NONE, R.id.b_item, Menu.NONE, "Menu B");        }        @Override        public boolean onContextItemSelected(MenuItem item) {            switch (item.getItemId()) {                case R.id.a_item:                    Log.i("ContextMenu", "Item 1a was chosen");                    return true;                case R.id.b_item:                    Log.i("ContextMenu", "Item 1b was chosen");                    return true;            }            return super.onContextItemSelected(item);        }    }}
想使用上下文菜单,在fragment中也可以,以上代码展示了如何使用,启动fragment的方式和以往一样。

4、FragmentCustomAnimators.java

fragment_slide_left_enter.xml

<?xml version="1.0" encoding="utf-8"?><!--/*** Copyright 2011, The Android Open Source Project**** Licensed under the Apache License, Version 2.0 (the "License");** you may not use this file except in compliance with the License.** You may obtain a copy of the License at****     http://www.apache.org/licenses/LICENSE-2.0**** Unless required by applicable law or agreed to in writing, software** distributed under the License is distributed on an "AS IS" BASIS,** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.** See the License for the specific language governing permissions and** limitations under the License.*/--><set xmlns:android="http://schemas.android.com/apk/res/android">    <objectAnimator        android:interpolator="@android:interpolator/decelerate_quint"        android:valueFrom="100dp" android:valueTo="0dp"        android:valueType="floatType"        android:propertyName="translationX"        android:duration="@android:integer/config_mediumAnimTime" />    <objectAnimator        android:interpolator="@android:interpolator/decelerate_quint"        android:valueFrom="0.0" android:valueTo="1.0"        android:valueType="floatType"        android:propertyName="alpha"        android:duration="@android:integer/config_mediumAnimTime" /></set>

fragment_slide_left_exit.xml

<?xml version="1.0" encoding="utf-8"?><!--/*** Copyright 2011, The Android Open Source Project**** Licensed under the Apache License, Version 2.0 (the "License");** you may not use this file except in compliance with the License.** You may obtain a copy of the License at****     http://www.apache.org/licenses/LICENSE-2.0**** Unless required by applicable law or agreed to in writing, software** distributed under the License is distributed on an "AS IS" BASIS,** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.** See the License for the specific language governing permissions and** limitations under the License.*/--><set xmlns:android="http://schemas.android.com/apk/res/android">    <objectAnimator        android:interpolator="@android:interpolator/decelerate_quint"        android:valueFrom="0dp" android:valueTo="-100dp"        android:valueType="floatType"        android:propertyName="translationX"        android:duration="@android:integer/config_mediumAnimTime" />    <objectAnimator        android:interpolator="@android:interpolator/decelerate_quint"        android:valueFrom="1.0" android:valueTo="0.0"        android:valueType="floatType"        android:propertyName="alpha"        android:duration="@android:integer/config_mediumAnimTime" /></set>

fragment_slide_right_enter.xml

<?xml version="1.0" encoding="utf-8"?><!--/*** Copyright 2011, The Android Open Source Project**** Licensed under the Apache License, Version 2.0 (the "License");** you may not use this file except in compliance with the License.** You may obtain a copy of the License at****     http://www.apache.org/licenses/LICENSE-2.0**** Unless required by applicable law or agreed to in writing, software** distributed under the License is distributed on an "AS IS" BASIS,** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.** See the License for the specific language governing permissions and** limitations under the License.*/--><set xmlns:android="http://schemas.android.com/apk/res/android">    <objectAnimator        android:interpolator="@android:interpolator/decelerate_quint"        android:valueFrom="-100dp" android:valueTo="0dp"        android:valueType="floatType"        android:propertyName="translationX"        android:duration="@android:integer/config_mediumAnimTime" />    <objectAnimator        android:interpolator="@android:interpolator/decelerate_quint"        android:valueFrom="0.0" android:valueTo="1.0"        android:valueType="floatType"        android:propertyName="alpha"        android:duration="@android:integer/config_mediumAnimTime" /></set>

fragment_slide_right_exit.xml

<?xml version="1.0" encoding="utf-8"?><!--/*** Copyright 2011, The Android Open Source Project**** Licensed under the Apache License, Version 2.0 (the "License");** you may not use this file except in compliance with the License.** You may obtain a copy of the License at****     http://www.apache.org/licenses/LICENSE-2.0**** Unless required by applicable law or agreed to in writing, software** distributed under the License is distributed on an "AS IS" BASIS,** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.** See the License for the specific language governing permissions and** limitations under the License.*/--><set xmlns:android="http://schemas.android.com/apk/res/android">    <objectAnimator        android:interpolator="@android:interpolator/decelerate_quint"        android:valueFrom="0dp" android:valueTo="100dp"        android:valueType="floatType"        android:propertyName="translationX"        android:duration="@android:integer/config_mediumAnimTime" />    <objectAnimator        android:interpolator="@android:interpolator/decelerate_quint"        android:valueFrom="1.0" android:valueTo="0.0"        android:valueType="floatType"        android:propertyName="alpha"        android:duration="@android:integer/config_mediumAnimTime" /></set>

FragmentCustomAnimators.java

/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.app;import com.example.android.apis.R;import android.app.Activity;import android.app.Fragment;import android.app.FragmentTransaction;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;/** * Demonstrates the use of custom animations in a FragmentTransaction when * pushing and popping a stack. */public class FragmentCustomAnimations extends Activity {    int mStackLevel = 1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.fragment_stack);        // Watch for button clicks.        Button button = (Button)findViewById(R.id.new_fragment);        button.setOnClickListener(new OnClickListener() {            public void onClick(View v) {                addFragmentToStack();            }        });        if (savedInstanceState == null) {            // Do first time initialization -- add initial fragment.            Fragment newFragment = CountingFragment.newInstance(mStackLevel);            FragmentTransaction ft = getFragmentManager().beginTransaction();            ft.add(R.id.simple_fragment, newFragment).commit();        } else {            mStackLevel = savedInstanceState.getInt("level");        }    }    @Override    public void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        outState.putInt("level", mStackLevel);    }//BEGIN_INCLUDE(add_stack)    void addFragmentToStack() {        mStackLevel++;        // Instantiate a new fragment.        Fragment newFragment = CountingFragment.newInstance(mStackLevel);        // Add the fragment to the activity, pushing this transaction        // on to the back stack.        FragmentTransaction ft = getFragmentManager().beginTransaction();        ft.setCustomAnimations(R.animator.fragment_slide_left_enter,                R.animator.fragment_slide_left_exit,                R.animator.fragment_slide_right_enter,                R.animator.fragment_slide_right_exit);        ft.replace(R.id.simple_fragment, newFragment);        ft.addToBackStack(null);        ft.commit();    }//END_INCLUDE(add_stack)//BEGIN_INCLUDE(fragment)    public static class CountingFragment extends Fragment {        int mNum;        /**         * Create a new instance of CountingFragment, providing "num"         * as an argument.         */        static CountingFragment newInstance(int num) {            CountingFragment f = new CountingFragment();            // Supply num input as an argument.            Bundle args = new Bundle();            args.putInt("num", num);            f.setArguments(args);            return f;        }        /**         * When creating, retrieve this instance's number from its arguments.         */        @Override        public void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            mNum = getArguments() != null ? getArguments().getInt("num") : 1;        }        /**         * The Fragment's UI is just a simple text view showing its         * instance number.         */        @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("Fragment #" + mNum);            tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));            return v;        }    }//END_INCLUDE(fragment)}

这个例子主要讲述使用动画,以及堆栈fragment,fragment不退出,不销毁,点击返回键才能销毁fragment。

动画的代码:

Fragment newFragment = CountingFragment.newInstance(mStackLevel);        // Add the fragment to the activity, pushing this transaction        // on to the back stack.        FragmentTransaction ft = getFragmentManager().beginTransaction();        ft.setCustomAnimations(R.animator.fragment_slide_left_enter,                R.animator.fragment_slide_left_exit,                R.animator.fragment_slide_right_enter,                R.animator.fragment_slide_right_exit);        ft.replace(R.id.simple_fragment, newFragment);

堆栈的fragment

ft.addToBackStack(null);

5、FragmentHideShow.java

fragment_hide_show.xml

<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2010 The Android Open Source Project     Licensed under the Apache License, Version 2.0 (the "License");     you may not use this file except in compliance with the License.     You may obtain a copy of the License at          http://www.apache.org/licenses/LICENSE-2.0     Unless required by applicable law or agreed to in writing, software     distributed under the License is distributed on an "AS IS" BASIS,     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.     See the License for the specific language governing permissions and     limitations under the License.--><!-- Top-level content view for the layout fragment sample. --><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:gravity="center_horizontal"    android:layout_width="match_parent" android:layout_height="match_parent">    <TextView android:layout_width="match_parent" android:layout_height="wrap_content"        android:gravity="center_vertical|center_horizontal"        android:textAppearance="?android:attr/textAppearanceMedium"        android:text="Demonstration of hiding and showing fragments." />    <LinearLayout android:orientation="horizontal" android:padding="4dip"        android:gravity="center_vertical" android:layout_weight="1"        android:layout_width="match_parent" android:layout_height="wrap_content">        <Button android:id="@+id/frag1hide"            android:layout_width="wrap_content" android:layout_height="wrap_content"            android:text="Hide" />        <fragment android:name="com.example.android.apis.app.FragmentHideShow$FirstFragment"                android:id="@+id/fragment1" android:layout_weight="1"                android:layout_width="0px" android:layout_height="wrap_content" />    </LinearLayout>    <LinearLayout android:orientation="horizontal" android:padding="4dip"        android:gravity="center_vertical" android:layout_weight="1"        android:layout_width="match_parent" android:layout_height="wrap_content">        <Button android:id="@+id/frag2hide"            android:layout_width="wrap_content" android:layout_height="wrap_content"            android:text="Hide" />        <fragment android:name="com.example.android.apis.app.FragmentHideShow$SecondFragment"                android:id="@+id/fragment2" android:layout_weight="1"                android:layout_width="0px" android:layout_height="wrap_content" />    </LinearLayout></LinearLayout>

FragmentHideShow.java

/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.app;import com.example.android.apis.R;import android.app.Activity;import android.app.Fragment;import android.app.FragmentManager;import android.app.FragmentTransaction;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;/** * Demonstration of hiding and showing fragments. */public class FragmentHideShow extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.fragment_hide_show);        // The content view embeds two fragments; now retrieve them and attach        // their "hide" button.        FragmentManager fm = getFragmentManager();        addShowHideListener(R.id.frag1hide, fm.findFragmentById(R.id.fragment1));        addShowHideListener(R.id.frag2hide, fm.findFragmentById(R.id.fragment2));    }    void addShowHideListener(int buttonId, final Fragment fragment) {        final Button button = (Button)findViewById(buttonId);        button.setOnClickListener(new OnClickListener() {            public void onClick(View v) {                FragmentTransaction ft = getFragmentManager().beginTransaction();                ft.setCustomAnimations(android.R.animator.fade_in,                        android.R.animator.fade_out);                if (fragment.isHidden()) {                    ft.show(fragment);                    button.setText("Hide");                } else {                    ft.hide(fragment);                    button.setText("Show");                }                ft.commit();            }        });    }    public static class FirstFragment extends Fragment {        TextView mTextView;        @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container,                Bundle savedInstanceState) {            View v = inflater.inflate(R.layout.labeled_text_edit, container, false);            View tv = v.findViewById(R.id.msg);            ((TextView)tv).setText("The fragment saves and restores this text.");            // Retrieve the text editor, and restore the last saved state if needed.            mTextView = (TextView)v.findViewById(R.id.saved);            if (savedInstanceState != null) {                mTextView.setText(savedInstanceState.getCharSequence("text"));            }            return v;        }        @Override        public void onSaveInstanceState(Bundle outState) {            super.onSaveInstanceState(outState);            // Remember the current text, to restore if we later restart.            outState.putCharSequence("text", mTextView.getText());        }    }    public static class SecondFragment extends Fragment {        @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container,                Bundle savedInstanceState) {            View v = inflater.inflate(R.layout.labeled_text_edit, container, false);            View tv = v.findViewById(R.id.msg);            ((TextView)tv).setText("The TextView saves and restores this text.");            // Retrieve the text editor and tell it to save and restore its state.            // Note that you will often set this in the layout XML, but since            // we are sharing our layout with the other fragment we will customize            // it here.            ((TextView)v.findViewById(R.id.saved)).setSaveEnabled(true);            return v;        }    }}

主要为了演示一个activity中可以存在两个以上的fragment,同时使用了动画。

<LinearLayout android:orientation="horizontal" android:padding="4dip"        android:gravity="center_vertical" android:layout_weight="1"        android:layout_width="match_parent" android:layout_height="wrap_content">        <Button android:id="@+id/frag1hide"            android:layout_width="wrap_content" android:layout_height="wrap_content"            android:text="Hide" />        <fragment android:name="com.example.android.apis.app.FragmentHideShow$FirstFragment"                android:id="@+id/fragment1" android:layout_weight="1"                android:layout_width="0px" android:layout_height="wrap_content" />    </LinearLayout>    <LinearLayout android:orientation="horizontal" android:padding="4dip"        android:gravity="center_vertical" android:layout_weight="1"        android:layout_width="match_parent" android:layout_height="wrap_content">        <Button android:id="@+id/frag2hide"            android:layout_width="wrap_content" android:layout_height="wrap_content"            android:text="Hide" />        <fragment android:name="com.example.android.apis.app.FragmentHideShow$SecondFragment"                android:id="@+id/fragment2" android:layout_weight="1"                android:layout_width="0px" android:layout_height="wrap_content" />    </LinearLayout>

动画

ft.setCustomAnimations(android.R.animator.fade_in,                        android.R.animator.fade_out);

6、FragmentLayout.java

/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.app;import com.example.android.apis.R;import com.example.android.apis.Shakespeare;import android.app.Activity;import android.app.Fragment;import android.app.FragmentTransaction;import android.app.ListFragment;import android.content.Intent;import android.content.res.Configuration;import android.os.Bundle;import android.util.TypedValue;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.ScrollView;import android.widget.TextView;/** * Demonstration of using fragments to implement different activity layouts. * This sample provides a different layout (and activity flow) when run in * landscape. */public class FragmentLayout extends Activity {//BEGIN_INCLUDE(main)    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);                setContentView(R.layout.fragment_layout);    }//END_INCLUDE(main)    /**     * This is a secondary activity, to show what the user has selected     * when the screen is not large enough to show it all in one activity.     *///BEGIN_INCLUDE(details_activity)    public static class DetailsActivity extends Activity {        @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            if (getResources().getConfiguration().orientation                    == Configuration.ORIENTATION_LANDSCAPE) {                // If the screen is now in landscape mode, we can show the                // dialog in-line with the list so we don't need this activity.                finish();                return;            }            if (savedInstanceState == null) {                // During initial setup, plug in the details fragment.                DetailsFragment details = new DetailsFragment();                details.setArguments(getIntent().getExtras());                getFragmentManager().beginTransaction().add(android.R.id.content, details).commit();            }        }    }//END_INCLUDE(details_activity)    /**     * This is the "top-level" fragment, showing a list of items that the     * user can pick.  Upon picking an item, it takes care of displaying the     * data to the user as appropriate based on the currrent UI layout.     *///BEGIN_INCLUDE(titles)    public static class TitlesFragment extends ListFragment {        boolean mDualPane;        int mCurCheckPosition = 0;        @Override        public void onActivityCreated(Bundle savedInstanceState) {            super.onActivityCreated(savedInstanceState);            // Populate list with our static array of titles.            setListAdapter(new ArrayAdapter<String>(getActivity(),                    android.R.layout.simple_list_item_activated_1, Shakespeare.TITLES));            // Check to see if we have a frame in which to embed the details            // fragment directly in the containing UI.            View detailsFrame = getActivity().findViewById(R.id.details);            mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;            if (savedInstanceState != null) {                // Restore last state for checked position.                mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);            }            if (mDualPane) {                // In dual-pane mode, the list view highlights the selected item.                getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);                // Make sure our UI is in the correct state.                showDetails(mCurCheckPosition);            }        }        @Override        public void onSaveInstanceState(Bundle outState) {            super.onSaveInstanceState(outState);            outState.putInt("curChoice", mCurCheckPosition);        }        @Override        public void onListItemClick(ListView l, View v, int position, long id) {            showDetails(position);        }        /**         * Helper function to show the details of a selected item, either by         * displaying a fragment in-place in the current UI, or starting a         * whole new activity in which it is displayed.         */        void showDetails(int index) {            mCurCheckPosition = index;            if (mDualPane) {                // We can display everything in-place with fragments, so update                // the list to highlight the selected item and show the data.                getListView().setItemChecked(index, true);                // Check what fragment is currently shown, replace if needed.                DetailsFragment details = (DetailsFragment)                        getFragmentManager().findFragmentById(R.id.details);                if (details == null || details.getShownIndex() != index) {                    // Make new fragment to show this selection.                    details = DetailsFragment.newInstance(index);                    // Execute a transaction, replacing any existing fragment                    // with this one inside the frame.                    FragmentTransaction ft = getFragmentManager().beginTransaction();                    ft.replace(R.id.details, details);                    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);                    ft.commit();                }            } else {                // Otherwise we need to launch a new activity to display                // the dialog fragment with selected text.                Intent intent = new Intent();                intent.setClass(getActivity(), DetailsActivity.class);                intent.putExtra("index", index);                startActivity(intent);            }        }    }//END_INCLUDE(titles)    /**     * This is the secondary fragment, displaying the details of a particular     * item.     *///BEGIN_INCLUDE(details)    public static class DetailsFragment extends Fragment {        /**         * Create a new instance of DetailsFragment, initialized to         * show the text at 'index'.         */        public static DetailsFragment newInstance(int index) {            DetailsFragment f = new DetailsFragment();            // Supply index input as an argument.            Bundle args = new Bundle();            args.putInt("index", index);            f.setArguments(args);            return f;        }        public int getShownIndex() {            return getArguments().getInt("index", 0);        }        @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container,                Bundle savedInstanceState) {            if (container == null) {                // We have different layouts, and in one of them this                // fragment's containing frame doesn't exist.  The fragment                // may still be created from its saved state, but there is                // no reason to try to create its view hierarchy because it                // won't be displayed.  Note this is not needed -- we could                // just run the code below, where we would create and return                // the view hierarchy; it would just never be used.                return null;            }            ScrollView scroller = new ScrollView(getActivity());            TextView text = new TextView(getActivity());            int padding = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,                    4, getActivity().getResources().getDisplayMetrics());            text.setPadding(padding, padding, padding, padding);            scroller.addView(text);            text.setText(Shakespeare.DIALOGUE[getShownIndex()]);            return scroller;        }    }//END_INCLUDE(details)}

主要用来演示如何使用ListFragment。

7、FragmentMenu.java

/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.app;import com.example.android.apis.R;import android.app.Activity;import android.app.Fragment;import android.app.FragmentManager;import android.app.FragmentTransaction;import android.os.Bundle;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.CheckBox;/** * Demonstrates how fragments can participate in the options menu. */public class FragmentMenu extends Activity {    Fragment mFragment1;    Fragment mFragment2;    CheckBox mCheckBox1;    CheckBox mCheckBox2;    // Update fragment visibility when check boxes are changed.    final OnClickListener mClickListener = new OnClickListener() {        public void onClick(View v) {            updateFragmentVisibility();        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.fragment_menu);                // Make sure the two menu fragments are created.        FragmentManager fm = getFragmentManager();        FragmentTransaction ft = fm.beginTransaction();        mFragment1 = fm.findFragmentByTag("f1");        if (mFragment1 == null) {            mFragment1 = new MenuFragment();            ft.add(mFragment1, "f1");        }        mFragment2 = fm.findFragmentByTag("f2");        if (mFragment2 == null) {            mFragment2 = new Menu2Fragment();            ft.add(mFragment2, "f2");        }        ft.commit();                // Watch check box clicks.        mCheckBox1 = (CheckBox)findViewById(R.id.menu1);        mCheckBox1.setOnClickListener(mClickListener);        mCheckBox2 = (CheckBox)findViewById(R.id.menu2);        mCheckBox2.setOnClickListener(mClickListener);                // Make sure fragments start out with correct visibility.        updateFragmentVisibility();    }    @Override    protected void onRestoreInstanceState(Bundle savedInstanceState) {        super.onRestoreInstanceState(savedInstanceState);        // Make sure fragments are updated after check box view state is restored.        updateFragmentVisibility();    }    // Update fragment visibility based on current check box state.    void updateFragmentVisibility() {        FragmentTransaction ft = getFragmentManager().beginTransaction();        if (mCheckBox1.isChecked()) ft.show(mFragment1);        else ft.hide(mFragment1);        if (mCheckBox2.isChecked()) ft.show(mFragment2);        else ft.hide(mFragment2);        ft.commit();    }    /**     * A fragment that displays a menu.  This fragment happens to not     * have a UI (it does not implement onCreateView), but it could also     * have one if it wanted.     */    public static class MenuFragment extends Fragment {        @Override        public void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setHasOptionsMenu(true);        }        @Override        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {            menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);            menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);        }    }    /**     * Second fragment with a menu.     */    public static class Menu2Fragment extends Fragment {        @Override        public void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setHasOptionsMenu(true);        }        @Override        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {            menu.add("Menu 2").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);        }    }}

主要演示了如何使用fragment配置menu菜单。

8、FragmentReceiverResults.java

/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.app;import com.example.android.apis.R;import android.app.Activity;import android.app.Fragment;import android.app.FragmentTransaction;import android.content.Intent;import android.os.Bundle;import android.text.Editable;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.widget.FrameLayout;import android.widget.TextView;public class FragmentReceiveResult extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(                ViewGroup.LayoutParams.MATCH_PARENT,                ViewGroup.LayoutParams.MATCH_PARENT);        FrameLayout frame = new FrameLayout(this);        frame.setId(R.id.simple_fragment);        setContentView(frame, lp);                if (savedInstanceState == null) {            // Do first time initialization -- add fragment.             Fragment newFragment = new ReceiveResultFragment();            FragmentTransaction ft = getFragmentManager().beginTransaction();            ft.add(R.id.simple_fragment, newFragment).commit();        }    }    public static class ReceiveResultFragment extends Fragment {        // Definition of the one requestCode we use for receiving resuls.        static final private int GET_CODE = 0;        private TextView mResults;        private OnClickListener mGetListener = new OnClickListener() {            public void onClick(View v) {                // Start the activity whose result we want to retrieve.  The                // result will come back with request code GET_CODE.                Intent intent = new Intent(getActivity(), SendResult.class);                startActivityForResult(intent, GET_CODE);            }        };        @Override        public void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);        }        @Override        public void onSaveInstanceState(Bundle outState) {            super.onSaveInstanceState(outState);        }        @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container,                Bundle savedInstanceState) {            View v = inflater.inflate(R.layout.receive_result, container, false);                        // Retrieve the TextView widget that will display results.            mResults = (TextView)v.findViewById(R.id.results);            // This allows us to later extend the text buffer.            mResults.setText(mResults.getText(), TextView.BufferType.EDITABLE);            // Watch for button clicks.            Button getButton = (Button)v.findViewById(R.id.get);            getButton.setOnClickListener(mGetListener);                        return v;        }        /**         * This method is called when the sending activity has finished, with the         * result it supplied.         */        @Override        public void onActivityResult(int requestCode, int resultCode, Intent data) {            // You can use the requestCode to select between multiple child            // activities you may have started.  Here there is only one thing            // we launch.            if (requestCode == GET_CODE) {                // We will be adding to our text.                Editable text = (Editable)mResults.getText();                // This is a standard resultCode that is sent back if the                // activity doesn't supply an explicit result.  It will also                // be returned if the activity failed to launch.                if (resultCode == RESULT_CANCELED) {                    text.append("(cancelled)");                // Our protocol with the sending activity is that it will send                // text in 'data' as its result.                } else {                    text.append("(okay ");                    text.append(Integer.toString(resultCode));                    text.append(") ");                    if (data != null) {                        text.append(data.getAction());                    }                }                text.append("\n");            }        }    }}

演示了调用onActivityResult方法接受返回值。

9、FragmentTabs.java

/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.android.apis.app;import com.example.android.apis.R;//BEGIN_INCLUDE(complete)import android.app.ActionBar;import android.app.ActionBar.Tab;import android.app.Activity;import android.app.Fragment;import android.app.FragmentTransaction;import android.os.Bundle;import android.widget.Toast;/** * This demonstrates the use of action bar tabs and how they interact * with other action bar features. */public class FragmentTabs extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        final ActionBar bar = getActionBar();        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);        bar.addTab(bar.newTab()                .setText("Simple")                .setTabListener(new TabListener<FragmentStack.CountingFragment>(                        this, "simple", FragmentStack.CountingFragment.class)));        bar.addTab(bar.newTab()                .setText("Contacts")                .setTabListener(new TabListener<LoaderCursor.CursorLoaderListFragment>(                        this, "contacts", LoaderCursor.CursorLoaderListFragment.class)));        bar.addTab(bar.newTab()                .setText("Apps")                .setTabListener(new TabListener<LoaderCustom.AppListFragment>(                        this, "apps", LoaderCustom.AppListFragment.class)));        bar.addTab(bar.newTab()                .setText("Throttle")                .setTabListener(new TabListener<LoaderThrottle.ThrottledLoaderListFragment>(                        this, "throttle", LoaderThrottle.ThrottledLoaderListFragment.class)));        if (savedInstanceState != null) {            bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));        }    }    @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        outState.putInt("tab", getActionBar().getSelectedNavigationIndex());    }    public static class TabListener<T extends Fragment> implements ActionBar.TabListener {        private final Activity mActivity;        private final String mTag;        private final Class<T> mClass;        private final Bundle mArgs;        private Fragment mFragment;        public TabListener(Activity activity, String tag, Class<T> clz) {            this(activity, tag, clz, null);        }        public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) {            mActivity = activity;            mTag = tag;            mClass = clz;            mArgs = args;            // Check to see if we already have a fragment for this tab, probably            // from a previously saved state.  If so, deactivate it, because our            // initial state is that a tab isn't shown.            mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);            if (mFragment != null && !mFragment.isDetached()) {                FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();                ft.detach(mFragment);                ft.commit();            }        }        public void onTabSelected(Tab tab, FragmentTransaction ft) {            if (mFragment == null) {                mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);                ft.add(android.R.id.content, mFragment, mTag);            } else {                ft.attach(mFragment);            }        }        public void onTabUnselected(Tab tab, FragmentTransaction ft) {            if (mFragment != null) {                ft.detach(mFragment);            }        }        public void onTabReselected(Tab tab, FragmentTransaction ft) {            Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show();        }    }}//END_INCLUDE(complete)

Fragment式的Tab样式。




原创粉丝点击