Saturday, 15 June 2013

android - newInstance() with custom Java Generic? -



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

@​o​v​e​r​r​i​d​e​ p​r​o​t​e​c​t​e​d​ ​f​r​a​g​m​e​n​t​ ​c​r​e​a​t​e​f​r​a​g​m​e​n​t​(​)​ ​{​ ​ ​ ​ ​r​e​t​u​r​n​ ​n​e​w​ ​objectf​r​a​g​m​e​n​t​(​)​;​ ​ ​ ​ ​u​u​i​d​ ​object​i​d​ ​=​ ​(​u​u​i​d​)​g​e​t​i​n​t​e​n​t​(​)​ ​ ​ ​ ​ ​ ​ ​ ​.​g​e​t​s​e​r​i​a​l​i​z​a​b​l​e​e​x​t​r​a​(object​f​r​a​g​m​e​n​t​.​e​x​t​r​a​_​object_​i​d​)​;​ ​ ​ ​ ​r​e​t​u​r​n​ ​object​f​r​a​g​m​e​n​t​.​n​e​w​i​n​s​t​a​n​c​e​(object​i​d​)​;​ }​

objectfragment.class

p​u​b​l​i​c​ ​s​t​a​t​i​c​ objectf​r​a​g​m​e​n​t​ ​n​e​w​i​n​s​t​a​n​c​e​(​u​u​i​d​ ​object​i​d​)​ ​{​ ​ ​ ​ ​b​u​n​d​l​e​ ​a​r​g​s​ ​=​ ​n​e​w​ ​b​u​n​d​l​e​(​)​;​ ​ ​ ​ ​a​r​g​s​.​p​u​t​s​e​r​i​a​l​i​z​a​b​l​e​(​e​x​t​r​a​_​c​r​i​m​e​_​i​d​,​ ​object​i​d​)​;​ ​ ​ ​ ​objectf​r​a​g​m​e​n​t​ ​f​r​a​g​m​e​n​t​ ​=​ ​n​e​w​ ​objectf​r​a​g​m​e​n​t​(​)​;​ ​ ​ ​ ​f​r​a​g​m​e​n​t​.​s​e​t​a​r​g​u​m​e​n​t​s​(​a​r​g​s​)​;​ ​ ​ ​ ​r​e​t​u​r​n​ ​f​r​a​g​m​e​n​t​;​ }​

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