2015-01-02 2 views
0

Итак, у меня есть MainActivity, который будет действовать как контейнер для хранения двух фрагментов; MainActivity является подклассом FragmentActivity. Верхний фрагмент представляет собой фрагмент с только Spinner который объявлен как внутренний класс в MainActivity:Динамическое добавление фрагментов из разных источников

public static class NavigationFragment extends Fragment { 

    public NavigationFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.navigation_fragment, container, false); 
     Spinner spinner = (Spinner)rootView.findViewById(R.id.menuSpinner); 

     // Create an ArrayAdapter using the string array and a default spinner layout 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.menuArray, android.R.layout.simple_spinner_item); 
     // Specify the layout to use when the list of choices appears 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     // Apply the adapter to the spinner 
     spinner.setAdapter(adapter); 

     spinner.setOnItemSelectedListener((MainActivity)getActivity()); 

     return rootView; 
    } 
} 

Когда MainActivity загружен, я успешно получить мой верхний фрагмент:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.mainContainer, new NavigationFragment()) 
       .commit(); 

    } 
} 

нижний фрагмент проблема. В другом файле у меня есть FragmentA, который на самом деле мало что делает, но имеет некоторые элементы ui, чтобы увидеть, работает ли он; это подкласс Fragment. Когда пользователь изменит значение счетчика, FragmentA будет удален и заменен FragmentB. Я пытаюсь добавить начального фрагмента это следующим образом:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.mainContainer, new NavigationFragment()) 
       .add(R.id.mainContainer, new FragmentA()) // THIS IS THE ONLY NEW LINE AND CAUSES THE ERROR 
       .commit(); 

    } 
} 

Я получаю ошибку can't resolved method add(int, com.mybundle.myapp.FragmentA). Я не понимаю, почему, потому что добавление NavigationFragment должны быть такими же, как добавление FragmentA как они оба продлить Fragment

Мой вопрос, как я правильно динамически добавлять, а затем заменить, фрагменты, которые не являются внутренними классами основной деятельности что их удерживает?

И еще мой вопрос: является ли это правильным способом достижения такого потока навигации? Я работаю с iOS в течение нескольких лет, поэтому переход на Android немного чуждо мне в плане дизайна и навигации.

+0

, почему у вас есть два «добавить» в одном контейнере ? сначала можно добавить, если контейнер еще не имеет фрагмента, второй должен быть заменен, потому что контейнер уже один фрагмент. – Xcihnegn

+0

Я использую add, потому что мне нужны оба фрагмента на экране. Не заменил бы замену существующего фрагмента? Или я не понимаю, как это работает? – Chris

+0

Почему бы не использовать два отдельных контейнера? то вам не нужно заменять – Xcihnegn

ответ

1

Проверьте файлы определений и убедитесь, что вы используете один и тот же импорт для FragmentTransaction везде так FragmentTransaction API поставляется с версией поддержки также для поддержки устройств с ОС версии 3.0 и старше

+0

Это также не работает, результаты этой же ошибки. Но, я также получаю другую ошибку в первой строке вашего блока. Это говорит мне, что 'beginTransaction()' возвращает 'android.support.v4.app.FragmentTransaction', где' FragmentTransaction' - 'android.app.FragmentTransaction'. Но когда я меняю тип на 'android.support.v4.app.FragmentTransaction' с помощью автоматической фиксации, то я получаю ту же ошибку, что и раньше – Chris

+0

Хм, странно, попробуйте' ft.replace() 'для второй транзакции и посмотреть, работает ли он. Вы получили другую ошибку, потому что используете версию поддержки «FragmentTransaction», но импортировали ее из 'android.app.FragmentTransaction' – Biu

+0

Нет, я получаю то же сообщение об ошибке – Chris

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