2016-09-21 5 views
9

У меня есть два класса фрагмент имя SessionTab и BillingTab и я пытаюсь создать экземпляр этого класса с помощьюКак создать экземпляр класса фрагмента, используя имя класса вместо индекса

SessionTab sessionTab = (SessionTab) getSupportFragmentManager().getFragments().get(1); 

, но иногда индекс для этих классов перепутаны и то это приводит к ClassCastException

Как я могу получить экземпляр класса этих фрагментов, передавая имя класса вместо индекса или какого-либо образом, чтобы убедиться в том, что индекс этого класса остается один и тем же каждый раз, так что это не вызывает ClassCastException

+0

Опубликовать остаток вашего кода, если вам по-прежнему нужна помощь. –

ответ

6

Используйте один из следующих методов: findFragmentById() и findFragmentByTag() методов.

Ссылка: https://developer.android.com/reference/android/app/FragmentManager.html#findFragmentById(int)

Update:

ClassCastException вызывается, когда вы не отливать соответствующие классы друг с другом. В вашем случае ваш FragmentManager возвращает другой фрагмент, чем SessionTab, поэтому исключение выбрано.

Если вы используете findFragmentById() или findFragmentByTag(), то он вернет фрагмент точно так, как вы хотите, и исключение не будет выбрано.

4

Определение «метки» для фрагмента при добавлении его как

getFragmentManager().beginTransaction().add(new Fragment(),"your_tag"); 

И в то время как ссылки на его использование

getFragmentManager().findFragmentByTag("your_tag"); 

В большинстве случаев, вы хотели бы использовать YourFragment.class.getSimpleName() в качестве тега.

+0

Я не уверен, как его реализовать. Я не могу создать экземпляр класса, используя это –

+0

Я думаю, что это лучший и самый чистый способ сделать это. @AkashKumar, где вы застряли? – codewing

+0

@ ZorawarSachdev 'YourFragment.class.getSimpleName() 'дал фрагменты родительский класс класса имя не текущее имя класса фрагмента –

1

Прежде всего, если вы должны понимать этот экземпляр для любого фрагмента, который вы можете взять из класса Java api. Как показано ниже:

Class<?> class = Class.forName("example.package.BillingFragment"); 
Constructor<?> cons = class.getConstructor(BillingFragment.class); 
BillingFragment object = (BillingFragment) cons.newInstance(); 

Пример кода show, как получить экземпляр из любого класса на Java. Но вы говорите немного о других вещах. Если я правильно понял, вы хотите получить фрагмент из FragmentManager.

Вы можете сделать это, если вы уже определили фрагмент раньше! Например, у вас есть поток базового приложения, а затем вы хотите добавить фрагмент. Вы можете проверить FragmentManager, если в стеке есть фрагменты. Но в случае пустого стека, вы должны вручную добавить их:

String billingFragmentTag = BillingFragment.class.getSimpleName(); 

...... 

if (getFragmentManager.findFragmentByTag(billingFragmentTag) == null) { 
    BillingFragment fragment = new BillingFragment(); 
    String billingFragmentTag = BillingFragment.class.getSimpleName(); 

    FragmentTransaction fragTrans = getFragmentManager().beginTransaction(); 
      fragTrans.add(fragment, billingFragmentTag).commit(); 
} 

...... 

Таким образом, после этого, вы можете проверить, если есть свой фрагмент в стеке и подключить этот активный экземпляр. Это правильный и стандартный поток для использования фрагментов.

...... 

if (getFragmentManager.findFragmentByTag(billingFragmentTag) != null) { 
    BillingFragment fragment = getFragmentManager.findFragmentByTag(billingFragmentTag); 
    String billingFragmentTag = BillingFragment.class.getSimpleName(); 

    FragmentTransaction fragTrans = getFragmentManager().beginTransaction(); 
      fragTrans.add(fragment, billingFragmentTag).commit(); 
} 

.... 

Добро пожаловать!

+0

почему вы просто не делаете BillingFragment object = new BillingFragment(); – codewing

Смежные вопросы