2016-04-30 2 views
0

У меня есть родительский диалог DialogFragment под названием TheParent и дочерний фрагмент под названием TheChild, который расширяет TheParent.Вызов newInstance() при создании дочернего фрагмента, расширяющего родительский фрагмент

Однако, мне нужно, чтобы иметь возможность инициализировать некоторые переменные в TheParent хотя я инстанцировании TheChild, так что я попытался было:

В родителю

public static TheParent newInstance(int myInt) { 
    Bundle args = new Bundle(); 
    TheParent fragment = new TheParent(); 
    args.putInt(ARGUMENT_MYINT, myInt); 
    fragment.setArguments(args); 
    return fragment; 
} 

, а затем в ребенке:

public static TheChild newInstance(int myInt) { 
    return super.newInstance(myInt); 
} 

Однако мне не нравится, что я делаю это из-за статического контекста.

Каков правильный способ вызова newInstance() в TheChild и вызвать ли он newInstance() родителя?

ответ

1

Статические методы, такие как новый экземпляр в TheParent, являются «классными» методами. Поэтому вместо вызова super.newInstance вы должны вызвать TheParent.newInstance (...). Просто помните, как вызвать статические методы, используя имя класса. Надеюсь, поможет. Все, что сказано, метод newInstance в TheChild имеет возвращаемое значение типа «TheChild». Это означает, что возврат экземпляра «TheParent» будет невозможным, это приведет к ошибке времени компиляции, которую вы увидите, как только вы измените код в TheChild с: «return super.newInstance()» на «TheParent.newInstance()».

+0

Итак, как правильно объявить/настроить ребенка, если родитель требует аргумента для настройки? Родитель нуждается в myInt –

+0

Поместите код инициализации в родительский класс в частный конструктор, который принимает int. Затем вызовите этот конструктор из TheParent.newInstance и передайте его myInt. В классе TheChild вам понадобится конструктор, который также принимает int и вызовы super (myInt), который является создателем-родителем, который вы только что создали, и в TheChild.newInstance вы вызовете этот конструктор в TheChild и передадите его myInt. Таким образом, как дочерний, так и родительский будут запускать код инициализации родителей, а фрагмент, созданный в TheChild, будет иметь тип TheChild, а не TheParent. –

0

Это то, что я сделал, чтобы удержаться от того, чтобы повторить всю логику в классе ребенка:

public static TheChild newInstance(int myInt) { 
    TheChild fragment = new TheChild(); 
    fragment.setArguments(TheParent.newInstance(myInt).getArguments()); 
    return fragment; 
} 

Конечно, это решение создает второй экземпляр TheParent на мгновение.

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