I am working on my first Non-tutorial app to develop and strengthen my Android development skills.
I use a lot of Java Generics to enhance reuse and debugging, especially because many of my fragments do the same with subclasses of the class Question.
I just stumbled upon a regular template for me, and I was wondering if I could apply it to generic classes in Java.
According to the text in the fragment classes, a method must be created newInstance(args,...)to handle the transition of Intent Extras to the 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: The Big Nerd Ranch Guide."
Java Generics?
, :
QuestionListActivity.class
public class QuestionListActivity extends SingleFragmentActivity {
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";
QuestionType mFragmentType;
@Override
protected Fragment createFragment() {
mFragmentType = (QuestionType) getIntent().getSerializableExtra(EXTRA_FRAGMENT_TYPE);
System.out.println("mFragmentType: " + mFragmentType);
switch (mFragmentType) {
case MULTIPLE_ANSWER_QUESTION:
case MULTIPLE_CHOICE_QUESTION:
case TRUE_FALSE_QUESTION:
return QuestionListFragment<MultipleAnswerQuestion>.newInstance(getIntent().getExtras());
case MATCHING_QUESTION:
return new QuestionListFragment<MatchingQuestion>();
case BLANK_QUESTION:
return new QuestionListFragment<BlankQuestion>();
default:
return new QuestionListFragment<Question>();
}
}
}
QuestionListFragment onCreate(). , , newInstance() Java Generics.
QuestionListFragment.class
public class QuestionListFragment<E extends Question> extends ListFragment implements QuestionDialogInterface {
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;
Flashcard mFlashcard;
QuestionType mQuestionType;
String mActivityTitle;
ArrayList<E> mQuestions;
DialogFragment mDialogFragment;
@SuppressWarnings({ "unchecked", "rawtypes" })
public static QuestionListFragment<? extends Question> newInstance(Bundle args) {
QuestionListFragment<? extends Question> fragment = new QuestionListFragment();
fragment.setArguments(args);
return fragment;
}
@SuppressWarnings("unchecked")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG,"Enter onCreate(Bundle savedInstanceState)");
setHasOptionsMenu(true);
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
Bundle extras = getActivity().getIntent().getExtras();
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);
mQuestions = (ArrayList<E>) mFlashcard.getQuestions(mQuestionType);
getActivity().setTitle(mActivityTitle);
ListItemLayoutAdapter adapter = new ListItemLayoutAdapter(mQuestions);
setListAdapter(adapter);
Log.d(TAG,"Exit onCreate(Bundle savedInstanceState)");
}
....
}
Best Practices Android Java Generics? - , , . newInstance(), , , :
return QuestionListFragment<MultipleAnswerQuestion>.newInstance(getIntent().getExtras());