Intereting Posts
Удаление apk в альфа-тестировании для загрузки другого с тем же кодом версии Простое приложение OCR с использованием камеры Android Проверьте, существует ли фрагмент и его повторное использование Защищенный RESTful API, который может использоваться веб-приложениями (угловыми), iOS и Android Как сравнить список массивов с мобильным контактом Как использовать значение imeactionId Как использовать эмулятор Android для тестирования приложения bluetooth? Ионный: как отображать ионный элемент на нескольких линиях? Является ли PhoneGap медленным или это ошибка? Android deeplink для каждого аромата Индикатор пользовательской вкладки (со стрелкой вниз, как индикатор) Android.database.CursorIndexOutOfBoundsException: запрашивается индекс 0 с размером 0 курсора Улавливать экран раньше, слишком поздно E / dalvikvm: Не удалось найти класс Как установить APK автоматически, когда загрузка файла завершена (размещена на приватном компьютере)

NewInstance () с пользовательским Java Generic?

Я работаю над своим первым «не-учебным» приложением, чтобы развивать и укреплять свои навыки разработки на Android.

Я использую много Java Generics для повышения повторного использования и отладки, особенно потому, что многие мои фрагменты делают то же самое с подклассами класса Question .

Я просто столкнулся с привычным для меня шаблоном, и мне было интересно, могу ли я применить его к Generic Classes в Java.

Согласно тексту, в классах фрагментов должен быть создан метод newInstance(args,...) для обработки перехода Intent Extras в аргументы фрагмента .

Пример:

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​;​ }​ 

Отрывок из: Брайан Харди. «Android-программирование: руководство по раннему ранчо».

Но как насчет случаев с использованием Java Generics?

Код, над которым я работаю:

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"; // 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 to refactor to newInstance(Bundle args) return QuestionListFragment<MultipleAnswerQuestion>.newInstance(getIntent().getExtras()); // ERROR case MATCHING_QUESTION: return new QuestionListFragment<MatchingQuestion>(); case BLANK_QUESTION: //return new BQFragment(); return new QuestionListFragment<BlankQuestion>(); default: return new QuestionListFragment<Question>(); } } } 

В настоящее время я получаю дополнительные функции из метода onCreate () метода QuestionListFragment. Я знаю, что я удалю этот код, если переход к соглашению newInstance () должен использоваться с 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; // Member Properties Flashcard mFlashcard; QuestionType mQuestionType; String mActivityTitle; ArrayList<E> mQuestions; DialogFragment mDialogFragment; // SOMETHING LIKE THIS??? @SuppressWarnings({ "unchecked", "rawtypes" }) public static QuestionListFragment<? extends Question> newInstance(Bundle args) { // Create a new instance of QuestionListFragment<? extends Question> QuestionListFragment<? extends Question> fragment = new QuestionListFragment(); // Set the arguments fragment.setArguments(args); // Return the Fragment return 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 the ActionBar 'UP' Button getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); // The Intent Extras Bundle extras = getActivity().getIntent().getExtras(); // Extract the Flashcard from the 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); // Get a Container of Multiple Answer Questions mQuestions = (ArrayList<E>) mFlashcard.getQuestions(mQuestionType); // Set the Title of the Fragment's Activity getActivity().setTitle(mActivityTitle); // Create a list ListItemLayoutAdapter adapter = new ListItemLayoutAdapter(mQuestions); // Set the adapter for the list setListAdapter(adapter); Log.d(TAG,"Exit onCreate(Bundle savedInstanceState)"); } .... } 

Что такое Best Practices в отношении Android-фрагментов и Java-дженериков? Может кто-то описать, каковы они, почему они должны использоваться. Если необходимо использовать newInstance (), пожалуйста, помогите мне исправить ошибку, указав правильный синтаксис объявления:

 // Attempting to refactor to newInstance(Bundle args) return QuestionListFragment<MultipleAnswerQuestion>.newInstance(getIntent().getExtras()); // ERROR 

      public static <T extends Question> QuestionListFragment<T> newInstance(Bundle args) { // Create a new instance of QuestionListFragment<? extends Question> QuestionListFragment<T> fragment = new QuestionListFragment<T>(); // Set the arguments fragment.setArguments(args); // Return the Fragment return fragment; } 

    А затем называть его:

      QuestionListFragment.<MultipleAnswerQuestion>newInstance(getIntent().getExtras()‌​);