android - newInstance() with custom Java Generic? -
i working on first 'non-tutorial' application grow , strengthen android development skill sets.
i've been using lots of java generics enhance reusability , debugging, since lots of fragments same thing subclasses of question
class.
i ran across conventional pattern new me , wondering if can apply generic classes in java.
according text, newinstance(args,...)
method should created within fragment classes handle transition of intent extras to fragment arguments.
example:
someactivity.class
@override protected fragment createfragment() { return new objectfragment(); uuid objectid = (uuid)getintent() .getserializableextra(objectfragment.extra_object_id); return objectfragment.newinstance(objectid); }
objectfragment.class
public static objectfragment newinstance(uuid objectid) { bundle args = new bundle(); args.putserializable(extra_crime_id, objectid); objectfragment fragment = new objectfragment(); fragment.setarguments(args); return fragment; }
excerpt from: brian hardy. “android programming: big nerd ranch guide.”
but cases using java generics?
code working on:
questionlistactivity.class
public class questionlistactivity extends singlefragmentactivity { // constants public static final string extra_fragment_type = "com.renaissanceartsmedia.flashcard.editquestionactivity.fragment"; public static final string extra_activity_title = "listquestionactivity.extra_activity_title"; public static final string tag = "questionlistactivity"; // fellow member properties questiontype mfragmenttype; @override protected fragment createfragment() { mfragmenttype = (questiontype) getintent().getserializableextra(extra_fragment_type); system.out.println("mfragmenttype: " + mfragmenttype); // switch on enumeration switch (mfragmenttype) { case multiple_answer_question: case multiple_choice_question: case true_false_question: // previous method //return new questionlistfragment<multipleanswerquestion>(); // attempting refactor newinstance(bundle args) homecoming questionlistfragment<multipleanswerquestion>.newinstance(getintent().getextras()); // error case matching_question: homecoming new questionlistfragment<matchingquestion>(); case blank_question: //return new bqfragment(); homecoming new questionlistfragment<blankquestion>(); default: homecoming new questionlistfragment<question>(); } } }
currently, getting extras within questionlistfragment's oncreate() method. know remove code if transitioning newinstance() convention should used java generics.
questionlistfragment.class
public class questionlistfragment<e extends question> extends listfragment implements questiondialoginterface { // constants public static final string tag = "questionlistfragement"; public static final string dialog_title = "questionlistfragment.dialog_title"; public static final string dialog_message = "questionlistfragment.dialog_message"; public static final string question_type = "question_type"; private static final int dialog_fragment = 1; // fellow member properties flashcard mflashcard; questiontype mquestiontype; string mactivitytitle; arraylist<e> mquestions; dialogfragment mdialogfragment; // this??? @suppresswarnings({ "unchecked", "rawtypes" }) public static questionlistfragment<? extends question> newinstance(bundle args) { // create new instance of questionlistfragment<? extends question> questionlistfragment<? extends question> fragment = new questionlistfragment(); // set arguments fragment.setarguments(args); // homecoming fragment homecoming fragment; } @suppresswarnings("unchecked") @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); log.d(tag,"enter oncreate(bundle savedinstancestate)"); // enable options menu sethasoptionsmenu(true); // create actionbar 'up' button getactivity().getactionbar().setdisplayhomeasupenabled(true); // intent extras bundle extras = getactivity().getintent().getextras(); // extract flashcard extras uuid flashcardid = (uuid) extras.getserializable(flashcard.extra_flashcard_id); mflashcard = flashcardstore.get(getactivity()).getflashcard(flashcardid); mquestiontype = (questiontype) extras.getserializable(editquestionactivity.extra_fragment_type); mactivitytitle = extras.getstring(questionlistactivity.extra_activity_title); // container of multiple reply questions mquestions = (arraylist<e>) mflashcard.getquestions(mquestiontype); // set title of fragment's activity getactivity().settitle(mactivitytitle); // create list listitemlayoutadapter adapter = new listitemlayoutadapter(mquestions); // set adapter list setlistadapter(adapter); log.d(tag,"exit oncreate(bundle savedinstancestate)"); } .... }
what best practices in regards android fragments , java generics? can describe are, why should used. if newinstance() should used, please help me prepare error providing right syntax declaring:
// attempting refactor newinstance(bundle args) homecoming questionlistfragment<multipleanswerquestion>.newinstance(getintent().getextras()); // error
public static <t extends question> questionlistfragment<t> newinstance(bundle args) { // create new instance of questionlistfragment<? extends question> questionlistfragment<t> fragment = new questionlistfragment<t>(); // set arguments fragment.setarguments(args); // homecoming fragment homecoming fragment; }
and phone call it:
questionlistfragment.<multipleanswerquestion>newinstance(getintent().getextras());
java android generics android-fragments
No comments:
Post a Comment