Я разрабатываю приложение, в котором пользователи могут создавать и редактировать свои собственные опросы. У меня есть два фрагмента, EditQuizFragment
и AddQuizFragment
, один из которых проходит другие:android: ClassCastException при попытке бросить фрагменты
public class EditQuizFragment extends Fragment
public class AddQuizFragment extends EditQuizFragment
Я хочу, чтобы бросить AddQuizFragment
(подкласс) на качестве EditQuizFragment
(суперкласса, который проходит фрагмент).
Когда я пытаюсь запустить следующее, я получаю ClassCastException
:
EditQuizFragment editQuizFragment = new EditQuizFragment();
AddQuizFragment addQuizFragment = (AddQuizFragment) editQuizFragment;
Вот сообщение об ошибке:
Caused by: java.lang.ClassCastException: com.quizmaker.fragments.EditQuizFragment cannot be cast to com.quizmaker.fragments.AddQuizFragment
Я попытался переместить ошибки, вызывающие код к другим классам, файлы и т. д., но все равно получите то же самое ClassCastException
.
Отметьте, что в EditQuizActivity
Я импортировал android.support.v4.app.Fragment
. Фактически я использую исключительно фрагмент библиотеки поддержки во всем этом приложении.
Почему я получаю это исключение? Кастинг должен отлично работать, как я понимаю.
Любая помощь или совет приветствуются!
EDIT: Нашли обходной путь. Поэтому я попытался сделать бросок, потому что использовал фрагмент newInstance для фрагментов (http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html). В AddQuizFragment.java я пытался сделать что-то вроде этого:
public static AddQuizFragment newInstance() {
return (AddQuizFragment) EditQuizFragment.newInstance(/* arguments here */);
}
Это то, что вызывает ClassCastException.
Все newInstance делает (или должен делать) набор аргументов для фрагмента, абстрагируя его от классов с использованием фрагмента. Таким образом, вместо того, чтобы выше, я сделал ниже:
public static AddQuizFragment newInstance() {
EditQuizFragment editQuizFragment = EditQuizFragment.newInstance(/* arguments here */);
AddQuizFragment addQuizFragment = new AddQuizFragment();
addQuizFragment.setArguments(editQuizFragment.getArguments()); // important line here
return addQuizFragment;
}
В том же смысле, что все квадраты являются прямоугольниками, но не все прямоугольники являются квадратами, все '' AddQuizFragment's являются EditQuizFragments', но не другой наоборот. У вас есть 'new EditQuizFragment()', который не создает 'AddQuizFragment'. –
@TavianBarnes Пожалуйста, см. Мой ответ на вопрос Kiskae – phitranphitranphitran