Kostya,

You did not waste my time at all!  First of all, this was a great
learning opportunity.  Second of all, the suggestion was great - this
should have worked!  Maybe I need to do a second pass, somehow, to reset
the dependent keys.  But if I need a second pass, maybe I just do it all
at that time.

...Jake


>>>>> "KV" == Kostya Vasilyev <kmans...@gmail.com> writes:

   KV> Jake,

   KV> I just tried it with a simple test, and yes, I get the same
   KV> exception.

   KV> The reason is that setDependency() tries to register the
   KV> dependency right away, and doesn't find the depndency because the
   KV> process of loading preferences from XML hasn't completed yet
   KV> (which it does not check).  It *might* be possible to work around
   KV> it with more overrides here and there, but... instead...

   KV> I admit that the idea only seemed good, and then was crushed to
   KV> pieces by the reality of how things work.

   KV> My apologies for having wasted your time.

   KV> -- Kostya

   KV> 2011/5/27 Jake Colman <col...@ppllc.com>

   >> 
   >> Kostya/String,
   >> 
   >> Is nothing ever easy?  So close, yet so far...  :-)
   >> 
   >> Some of my preferences have dependent keys.  Since the keys are being
   >> renamed to be widget-specific I, of course, have to rename the dependent
   >> keys accordingly as well.
   >> 
   >> Pref2 is dependent on Pref1.  Pref1 comes through my overridden
   >> onPrepareAddPreference and I call setKey to rename its key.  Pref2 comes
   >> through onPrepareAddPreference and I reset its key as usual and I also
   >> reset its dependent key to have the correct Pref1 key name.  This
   >> triggers a java.lang.IllegalStateException stating that Dependency not
   >> found for preference.
   >> 
   >> Since Pref1 has already been reset I would expect that by the time Pref2
   >> comes in Pref1 is already out there.  Also, I did not think that
   >> ordering would matter anyway as long as all the keys make sense at the
   >> of the inflation.
   >> 
   >> Any ideas?
   >> 
   >> Incidentally, I tried both onPrepareAddPreference and addPreference just
   >> in case one worked differently than the other.  And, yes, I called up to
   >> super at the end of my overridden method.
   >> 
   >> ...Jake
   >> 
   >> 
   >> >>>>> "KV" == Kostya Vasilyev <kmans...@gmail.com> writes:
   >> 
   KV> Yes, a cast is what I'm suggesting. From the design point of
   KV> view, you'll end up with two classes that are meant to be used
   KV> together.
   >> 
   KV> You could even do an instanceof check before the cast, and throw
   KV> an exception with a nice descriptive message if the check returns
   KV> false :)
   >> 
   KV> --
   KV> Kostya Vasilyev
   KV> 27.05.2011 1:56 пользователь "Jake Colman"
   KV> <col...@ppllc.com>
   KV> написал:
   >> >>
   >> >>
   >> >> All the magic happens from addPreferencesFromResource which inflates
   >> my
   >> >> preferences XML and instantiates the Preference objects. With
   >> >> everything we've discussed until now, I know what/how to subclass so
   >> >> that I can hook into things at the correct level to reset my key. But
   >> >> if it's WidgetOptionsActivity that has the widget id (from its super
   >> >> class) how does that get passed into addPreferencesFromResource?
   >> >>
   >> >> Unless you are suggesting that I can call a method via the context
   >> which
   >> >> is, in essence, my Activity? So cast the context into the Activity and
   >> >> call the method?
   >> >>
   >> >>
   >> >>>>>>> "KV" == Kostya Vasilyev <kmans...@gmail.com> writes:
   >> >>
   KV> Preferences are inflated with a Context, which in this case is
   KV> your PreferenceActivity subclass.
   >> >>
   KV> I'd make two classes, WidgetOptionsActivity and
   KV> WidgetOptionsPreferenceCategory, with the expectation that the
   KV> latter is always used within the former (like maps API and
   KV> MapActivity).
   >> >>
   KV> The widget id is passed to the activity as an intent extra, so
   KV> just get it from there and make available as a method / field
   KV> before you call addPreferencesFromResource().
   >> >>
   KV> Then you could derive YourProjectNameWidgetOptionsActivity from
   KV> WidgetOptionsActivity.
   >> >>
   KV> -- Kostya
   >> >>
   KV> 2011/5/27 Jake Colman <col...@ppllc.com>
   >> >>
   >> >> >>
   >> >> >> Thanks Kostya and String, these were great answers.
   >> >> >>
   >> >> >> I can see how I can create my own subclass and use them instead of
   >> my
   >> >> >> the android classes. My problem now is that it is the Preference
   >> >> >> Activity, through an intent extra, that knows the specific widget
   >> ID
   KV> for
   >> >> >> which it is being displayed. I don't see that the Preference or
   >> >> >> PreferenceCategory subclassses have access to the parent activity
   >> that
   >> >> >> caused them to be created. Since Android is instantiating my
   >> subclasses
   >> >> >> for me, I don't see how I have a hook to pass the subclass the
   >> crucial
   >> >> >> piece of data required to reset its key - which is the whole
   >> purpose of
   >> >> >> this exercise.
   >> >> >>
   >> >> >> It looks like onPrepareAddPreference is probable the better place
   >> to
   >> >> >> reset the key than is addPreference simply because this is more of
   >> a
   >> >> >> preparation step anyway. It's great to have multiple options!
   >> >> >>
   >> >> >> ...Jake
   >> >> >>
   >> >> >>
   >> >> >> >>>>> "KV" == Kostya Vasilyev <kmans...@gmail.com> writes:
   >> >> >>
   KV> Where your preference class needs to have the standard
   KV> constructor, just like with views:
   >> >> >>
   KV> public class MyPreferenceCategory extends PreferenceCategory {
   >> >> >>
   KV> public MyPreferenceCategory(Context context, AttributeSet attrs)
   >> >> >> {
   KV> super(context, attrs);
   KV> }
   >> >> >>
   KV> }
   >> >> >>
   KV> And here is another useful override:
   >> >> >>
   KV> 
   >> >> >>
   KV> 
   >> 
http://developer.android.com/reference/android/preference/PreferenceGroup.html#onPrepareAddPreference(android.preference.Preference
   KV> )
   >> >> >>
   KV> onPrepareAddPreference
   >> >> >>
   KV> -- Kostya
   >> >> >>
   KV> 2011/5/27 String <sterling.ud...@googlemail.com>
   >> >> >>
   >> >> >> >> In your XML settings-definition file, here's what you need. Just
   KV> use:
   >> >> >> >>
   >> >> >> >> <com.my.package.PrefSubclass
   >> >> >> >> android:key="pref_key"
   >> >> >> >> ...
   >> >> >> >> />
   >> >> >> >>
   >> >> >> >> where "com.my.package" is your package name, and PrefSubclass is
   >> the
   >> >> >> class
   >> >> >> >> name of your Preference subclass. Use this instead of:
   >> >> >> >>
   >> >> >> >> <EditTextPreference
   >> >> >> >> android:key="pref_key"
   >> >> >> >> ...
   >> >> >> >> />
   >> >> >> >>
   >> >> >> >> or whatever Preference class you're basing it off of.
   >> >> >> >>
   >> >> >> >> String
   >> >> >> >>
   >> >> >> >> --
   >> >> >> >> You received this message because you are subscribed to the
   >> Google
   >> >> >> >> Groups "Android Developers" group.
   >> >> >> >> To post to this group, send email to
   >> >> >> android-developers@googlegroups.com
   >> >> >> >> To unsubscribe from this group, send email to
   >> >> >> >> android-developers+unsubscr...@googlegroups.com
   >> >> >> >> For more options, visit this group at
   >> >> >> >> http://groups.google.com/group/android-developers?hl=en
   >> >> >> >>
   >> >> >>
   KV> --
   KV> You received this message because you are subscribed to the Google
   KV> Groups "Android Developers" group.
   KV> To post to this group, send email to
   >> >> >> android-developers@googlegroups.com
   KV> To unsubscribe from this group, send email to
   KV> android-developers+unsubscr...@googlegroups.com
   KV> For more options, visit this group at
   KV> http://groups.google.com/group/android-developers?hl=en
   >> >> >>
   >> >> >> --
   >> >> >> Jake Colman -- Android Tinkerer
   >> >> >>
   >> >> >> --
   >> >> >> You received this message because you are subscribed to the Google
   >> >> >> Groups "Android Developers" group.
   >> >> >> To post to this group, send email to
   KV> android-developers@googlegroups.com
   >> >> >> To unsubscribe from this group, send email to
   >> >> >> android-developers+unsubscr...@googlegroups.com
   >> >> >> For more options, visit this group at
   >> >> >> http://groups.google.com/group/android-developers?hl=en
   >> >> >>
   >> >>
   KV> --
   KV> You received this message because you are subscribed to the Google
   KV> Groups "Android Developers" group.
   KV> To post to this group, send email to
   KV> android-developers@googlegroups.com
   KV> To unsubscribe from this group, send email to
   KV> android-developers+unsubscr...@googlegroups.com
   KV> For more options, visit this group at
   KV> http://groups.google.com/group/android-developers?hl=en
   >> >>
   >> >> --
   >> >> Jake Colman -- Android Tinkerer
   >> >>
   >> >> --
   >> >> You received this message because you are subscribed to the Google
   >> >> Groups "Android Developers" group.
   >> >> To post to this group, send email to
   >> android-developers@googlegroups.com
   >> >> To unsubscribe from this group, send email to
   >> >> android-developers+unsubscr...@googlegroups.com
   >> >> For more options, visit this group at
   >> >> http://groups.google.com/group/android-developers?hl=en
   >> 
   KV> --
   KV> You received this message because you are subscribed to the Google
   KV> Groups "Android Developers" group.
   KV> To post to this group, send email to
   >> android-developers@googlegroups.com
   KV> To unsubscribe from this group, send email to
   KV> android-developers+unsubscr...@googlegroups.com
   KV> For more options, visit this group at
   KV> http://groups.google.com/group/android-developers?hl=en
   >> 
   >> --
   >> Jake Colman -- Android Tinkerer
   >> 
   >> --
   >> You received this message because you are subscribed to the Google
   >> Groups "Android Developers" group.
   >> To post to this group, send email to android-developers@googlegroups.com
   >> To unsubscribe from this group, send email to
   >> android-developers+unsubscr...@googlegroups.com
   >> For more options, visit this group at
   >> http://groups.google.com/group/android-developers?hl=en
   >> 

   KV> -- 
   KV> You received this message because you are subscribed to the Google
   KV> Groups "Android Developers" group.
   KV> To post to this group, send email to android-developers@googlegroups.com
   KV> To unsubscribe from this group, send email to
   KV> android-developers+unsubscr...@googlegroups.com
   KV> For more options, visit this group at
   KV> http://groups.google.com/group/android-developers?hl=en

-- 
Jake Colman -- Android Tinkerer

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to