#android #fragment
#Android #фрагмент
Вопрос:
Я пытаюсь добавить фрагмент с помощью программирования, а затем вызвать один из его методов. Я получаю исключение нулевого указателя при вызове любых элементов фрагмента.
Fragment fragment = new HomeFragment();
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.frame_inner_container, fragment).commit();
((HomeFragment) fragment).homeSelected(true);
а затем во фрагменте
public void homeSelected(boolean val) {
if (val) {
homeButton.setBackgroundColor(getResources().getColor(R.color.header_bg));
} else {
homeButton.setBackgroundColor(getResources().getColor(R.color.screen_bg));
}
}
homeButton всегда равен нулю. Я проверил это и обнаружил, что onActivityCreated вызывается после этого метода. Любой способ решить эту проблему.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_home, container, false);
listView = (ListView) v.findViewById(R.id.list_view);
homeButton = (Button) v.findViewById(R.id.menu_btn_home);
return v;
}
Комментарии:
1. Я думаю, что один из способов — установить таймер на 1 секунду перед вызовом метода fragment. Но не думаю, что это возможно
2. homeButton равен нулю по другой причине. Что такое homeButton и как вы получаете этот объект homeButton? Можете ли вы показать его код?
3. Вы уверены, что вызываете этот метод после инициализации homeButton,,?
4. вставьте код домашней кнопки.
5. Вставлен для инициализации homeButton
Ответ №1:
Вам необходимо вызвать executePendingTransactions () для немедленного выполнения.
После фиксации фрагментной транзакции с помощью FragmentTransaction.commit() планируется, что она будет выполнена асинхронно в главном потоке процесса. Если вы хотите немедленно выполнить какие-либо такие ожидающие операции, вы можете вызвать эту функцию (только из основного потока) для этого. Обратите внимание, что все обратные вызовы и другое связанное с ними поведение будут выполняться из этого вызова, поэтому будьте осторожны с тем, откуда это вызывается. ВОЗВРАТ
Returns true if there were any pending transactions to be executed.
Ответ №2:
Вероятно, вы вызываете метод homeSelected
до того, как было создано представление R.layout.fragment_home
.
Выполните этот вызов первым в activity-
Fragment fragment = new HomeFragment();
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().
replace(R.id.frame_inner_container, fragment).commit();
Затем во фрагменте, первый вызов onAttach()
,
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//attach your activity here
}
Затем вы можете вызвать,
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
/*Somewhere here*/
((HomeFragment) fragment).homeSelected(true);
}