1

У меня есть одно действие с ViewGroup, которое я хочу использовать для замены на пару фрагментов в зависимости от потока пользователя (так что я либо покажу один фрагмент, либо другой).Мгновенно активировать фрагменты Android при использовании Roboguice Dependency Injection

(...) 
    <FrameLayout 
     android:id="@+id/fragment_container" 
     android:layout_width="match_parent" 
     android:layout_height="276dp" 
     android:layout_gravity="center_horizontal|bottom"> 
    </FrameLayout> 
    (...) 

Чтобы установить фрагмент, я использую следующий код:

private void setBottomFragment(Fragment fragment) { 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.fragment_container, fragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 

Если я создаю экземпляр фрагмента сам с новым, он работает:

setBottomFragment(new InformationFragment()); 

Однако, я не Я не хочу сам создавать экземпляр. Я хочу, чтобы мои экземпляры фрагмента будет управляться моей структуры управления зависимостями (я использую Roboguice)

Так что я хотел бы сделать что-то вроде этого:

@ContentView(R.layout.activity_scan) 
public class ScanActivity extends RoboFragmentActivity { 

    @InjectFragment(R.id.information_fragment) 
    private InformationFragment informationFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setBottomFragment(informationFragment); 
    } 
} 

Делая это, я буду способный использовать инъекцию зависимостей также на моих Фрагментах, вместо того, чтобы самостоятельно находить компоненты.

public class InformationFragment extends RoboFragment { 

     // I'll have an event handler for this button and I don't want to be finding it myself if I can have it injected instead. 
     @InjectView(R.id.resultButton) 
     private Button resultButton; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      // Inflate the layout for this fragment 
      return inflater.inflate(R.layout.fragment_information, container, false); 
     } 
    } 

Так в основном мой вопрос: как я могу programaticly экземпляр фрагмента при использовании рамки инъекции зависимостей, как Roboguice?

Все, что я могу найти в документации Roboguice, являются примерами DI с фрагментами, которые изначально визуализируются с представлением и не динамически добавляются впоследствии, как я пытаюсь сделать. Это заставляет меня поверить, что я что-то пропускаю либо в жизненном цикле компонентов, либо в том, как Roboguice обрабатывает DI.

Любые идеи исправить это или указатели в правильном направлении были бы очень полезными.

+0

ли вы реализовать метод жизненного цикла onCreateView в вашем фрагменте, где расположение получает надувают? –

+0

Да, я создал метод. Или IDE сделал, когда я создал фрагмент. Я отредактирую исходный вопрос, чтобы сказать это. – redwulf

ответ

0

Нашел ответ сам, и, поскольку он может быть полезен кому-то другому, я отправлю его здесь.

Это намного проще, чем я ожидал (и немного очевидно). Поскольку фрагмент не является частью представления при первой загрузке активности, мы не можем использовать @InjectFragment. Вместо этого следует использовать @Inject, поэтому фрагмент обрабатывается как любая другая зависимость от неотображения.

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

@ContentView(R.layout.activity_scan) 
public class ScanActivity extends RoboFragmentActivity { 

    @Inject // This is all that needs to change 
    private InformationFragment informationFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setBottomFragment(informationFragment); 
    } 
} 

Это просто ...