From e3a7f628c6d9fef42be24999b3137ebe5c6f3525 Mon Sep 17 00:00:00 2001
From: Dianne Hackborn This is called every time the fragment is inflated, even if it is
- * being inflated into a new instance with saved state. Because a fragment's
- * arguments are retained across instances, it may make no sense to re-parse
- * the attributes into new arguments. You may want to first check
- * {@link #getArguments()} and only parse the attributes if it returns null,
- * the assumption being that if it is non-null those are the same arguments
- * from the first time the fragment was inflated. (That said, you may want
- * to have layouts change for different configurations such as landscape
- * and portrait, which can have different attributes. If so, you will need
- * to re-parse the attributes each time this is called to generate new
- * arguments.)
Here is a typical implementation of a fragment that can take parameters + * both through attributes supplied here as well from {@link #getArguments()}:
+ * + * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java + * fragment} + * + *Note that parsing the XML attributes uses a "styleable" resource. The + * declaration for the styleable used here is:
+ * + * {@sample development/samples/ApiDemos/res/values/attrs.xml fragment_arguments} * + *The fragment can then be declared within its activity's content layout + * through a tag like this:
+ * + * {@sample development/samples/ApiDemos/res/layout/fragment_arguments.xml from_attributes} + * + *This fragment can also be created dynamically from arguments given + * at runtime in the arguments Bundle; here is an example of doing so at + * creation of the containing activity:
+ * + * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java + * create} + * + * @param activity The Activity that is inflating this fragment. * @param attrs The attributes at the tag where the fragment is * being created. * @param savedInstanceState If the fragment is being re-created from * a previous saved state, this is the state. */ - public void onInflate(AttributeSet attrs, Bundle savedInstanceState) { + public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { + onInflate(attrs, savedInstanceState); mCalled = true; } diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index d8d0a5b4f428f..ab60cf016ba9c 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -660,6 +660,12 @@ final class FragmentManagerImpl extends FragmentManager { } if (f.mState < newState) { + // For fragments that are created from a layout, when restoring from + // state we don't want to allow them to be created until they are + // being reloaded from the layout. + if (f.mFromLayout && !f.mInLayout) { + return; + } if (f.mAnimatingAway != null) { // The fragment is currently being animated... but! Now we // want to move our state back up. Give up on waiting for the diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java index 8eac7aa9e1b81..c288f8a21b238 100644 --- a/core/java/android/os/Bundle.java +++ b/core/java/android/os/Bundle.java @@ -1028,7 +1028,6 @@ public final class Bundle implements Parcelable, Cloneable { } } - /** * Returns the value associated with the given key, or null if * no mapping of the desired type exists for the given key or a null @@ -1051,6 +1050,28 @@ public final class Bundle implements Parcelable, Cloneable { } } + /** + * Returns the value associated with the given key, or defaultValue if + * no mapping of the desired type exists for the given key. + * + * @param key a String, or null + * @param defaultValue Value to return if key does not exist + * @return a String value, or null + */ + public String getString(String key, String defaultValue) { + unparcel(); + Object o = mMap.get(key); + if (o == null) { + return defaultValue; + } + try { + return (String) o; + } catch (ClassCastException e) { + typeWarning(key, o, "String", e); + return defaultValue; + } + } + /** * Returns the value associated with the given key, or null if * no mapping of the desired type exists for the given key or a null @@ -1073,6 +1094,28 @@ public final class Bundle implements Parcelable, Cloneable { } } + /** + * Returns the value associated with the given key, or defaultValue if + * no mapping of the desired type exists for the given key. + * + * @param key a String, or null + * @param defaultValue Value to return if key does not exist + * @return a CharSequence value, or null + */ + public CharSequence getCharSequence(String key, CharSequence defaultValue) { + unparcel(); + Object o = mMap.get(key); + if (o == null) { + return defaultValue; + } + try { + return (CharSequence) o; + } catch (ClassCastException e) { + typeWarning(key, o, "CharSequence", e); + return defaultValue; + } + } + /** * Returns the value associated with the given key, or null if * no mapping of the desired type exists for the given key or a null diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index 44b859098e051..8067e1275a7c2 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -1859,8 +1859,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub }); } mSwitchingDialog = mDialogBuilder.create(); + mSwitchingDialog.setCanceledOnTouchOutside(true); mSwitchingDialog.getWindow().setType( WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG); + mSwitchingDialog.getWindow().getAttributes().setTitle("Select input method"); mSwitchingDialog.show(); } }