Как изменить тему Действия при изменении фрагмента в android
Привет, я использую ViewPager для переключения между фрагментами в действии. Каждый фрагмент имеет свой собственный цвет фона, поэтому я устанавливаю разные темы. Я знаю, что должен установить тему мероприятия раньше
setContentView(R.layout.activity_walk_through);- Но это довольно сложно. Как установить различные темы для действия, если текущий элемент действия установлен на фрагмент? Вот мой код
Что я уже пробовал:
Деятельность по
ViewPagerAdapter viewPagerAdapter; ViewPager mViewPager; static final String KEY_IS_FIRST_TIME = "com.geeks14.sureremit.first_time"; static final String KEY = "com.com.geeks14.sureremit"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_walk_through); viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); viewPagerAdapter.addFragment(new WalkThroughOneFragment(), "Walkthrough One"); viewPagerAdapter.addFragment(new WalkThroughTwo(), "Walkthrough Two"); viewPagerAdapter.addFragment(new WalkThroughThreeFragment(), "Walkthrough Three"); mViewPager = (ViewPager)findViewById(R.id.pager); mViewPager.setAdapter(viewPagerAdapter); setTitle(""); } public void setCurrentItem (int item, boolean smoothScroll) { mViewPager.setCurrentItem(item, smoothScroll); } class ViewPagerAdapter extends FragmentPagerAdapter { private final List<Fragment> fragmentList = new ArrayList<>(); private final List<String> fragmentTitleList = new ArrayList<>(); public ViewPagerAdapter(FragmentManager manager){ super(manager); } @Override public Fragment getItem(int position){ return fragmentList.get(position); } @Override public int getCount(){ return fragmentList.size(); } public void addFragment(Fragment fragment, String title){ fragmentList.add(fragment); fragmentTitleList.add(title); } @Override public CharSequence getPageTitle(int position){ return fragmentTitleList.get(position); } }
Вот одна из активностей моего фрагмента
public static WalkThroughOneFragment newInstance(String param1, String param2) { WalkThroughOneFragment fragment = new WalkThroughOneFragment(); Bundle args = new Bundle(); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //i set activity theme here but it did nothing } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View v = inflater.inflate(R.layout.fragment_walk_through_one, container, false); nextButton = (FontButton)v.findViewById(R.id.FragmentOneNextButton); nextButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ((WalkThroughActivity)getActivity()).setCurrentItem(1, true);//fragment is set here } }); return v; }
David Crow
Ты не пробовал позвонить setTheme()
до setContentView()
?
Видеть здесь.
EasyHero
я знаю, что это сработает, как я уже сказал в своем вопросе. Но моя проблема здесь заключается в том, что активность не воссоздается при переключении между представлениями фрагментов. Следовательно, я был бы в состоянии сделать это
David Crow
Почему вы хотите, чтобы действие было воссоздано при переключении между фрагментами? Когда ViewPagerAdapter
при переключении на новый фрагмент (родительское) действие должно оставаться нетронутым. Есть исключения из этого правила, но это всего лишь...исключения.
EasyHero
Исходя из моего вопроса, я хочу добиться следующего: когда ViewPagerAdapter изменится на новый фрагмент, я хочу установить новую тему для родителя. вызов функции setTheme() перед функцией setContentView() приведет к установке темы только один раз для данного действия
David Crow
В onCreateView()
метод, вы рассматривали возможность создания ContextThemeWrapper
и надуваться от этого? Что-то вроде:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Context ctx = new ContextThemeWrapper(getActivity(), R.style.some_custom_theme); LayoutInflater li = inflater.cloneInContext(ctx); ... return li.inflate(R.layout.fragment_walk_through_one, container, false); }
EasyHero
Привет, я только что попробовал это сделать, но ничего не вышло
David Crow
Попробуйте спросить на самом форуме Android.
wseng
вы действительно можете установить тему в xml-макете
EasyHero
Это за осколки, да?