EasyHero Ответов: 1

Как изменить тему Действия при изменении фрагмента в 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

Это за осколки, да?

1 Ответов

Рейтинг:
0

EasyHero

Хорошо, после долгих проб я наконец нашел это здесь
Все, что мне нужно было сделать, это скрыть строку состояния, таким образом, каждый фрагмент занимает полноэкранный режим. Я скрыл строку состояния, поместив код ниже в действие, в котором у меня были мои фрагменты до setContentView()

View decorView = getWindow().getDecorView();
        // Hide the status bar.
        int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);