Итак, у меня есть 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 немного чуждо мне в плане дизайна и навигации.
, почему у вас есть два «добавить» в одном контейнере ? сначала можно добавить, если контейнер еще не имеет фрагмента, второй должен быть заменен, потому что контейнер уже один фрагмент. – Xcihnegn
Я использую add, потому что мне нужны оба фрагмента на экране. Не заменил бы замену существующего фрагмента? Или я не понимаю, как это работает? – Chris
Почему бы не использовать два отдельных контейнера? то вам не нужно заменять – Xcihnegn