Я пытаюсь создать следующий сценарий:
Пользователь нажимает Button
>, это показывает DialogFragment
DialogFragment
содержит ViewPager
, который имеет 2 вкладки - одна показываетфрагмент выбора цвета и другой фрагмент выбора символа. Каждый фрагмент выбора содержит адаптер, который преобразует массив цветов / символов в красивую сетку.
Однако в настоящее время он отображается пустым - появляется DialogFragment
сдругие части фрагмента, но без представления адаптера.
Вот что у меня есть:
Начальное действие называется EditActivity
.У него есть Button
, который при нажатии вызывает эту функцию, чтобы показать, что DialogFragmentPickers
:
public void showPickers() {
if(mDialogFragmentPickers == null) return;
mDialogFragmentPickers.setColourSet(mColourSet);
mDialogFragmentPickers.show(mFragmentManager, "Pickers");
}
DialogFragmentPickers
инициализируется в методе onCreate
EditActivity
следующим образом:
mDialogFragmentPickers = new DialogFragmentPickers();
Передаваемый ColourSet
- это просто массив цветов, которые должны отображаться в средстве выбора.DialogFragmentPickers
должен затем передать его в FragmentColourPicker
при инициализации.
Класс DialogFragmentPickers
выглядит следующим образом (я показал только части, относящиеся к ColourPicker
, но SymbolPicker
работает аналогично):
public class DialogFragmentPickers extends DialogFragment {
private PickersPagerAdapter mPagerAdapter;
private ViewPager mViewPager;
private ColourSet mColourSet;
private FragmentColourPicker mColourPicker;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
// Inflate layout
View view = inflater.inflate(R.layout.dialog_fragment_pickers, container, false);
mPagerAdapter = new PickersPagerAdapter(getChildFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = view.findViewById(R.id.pager);
mViewPager.setAdapter(mPagerAdapter);
return view;
}
public void setColourSet(ColourSet colourSet) {
mColourSet = colourSet;
if(mColourPicker == null) getColourPickerFragment();
else mColourPicker.setColourSet(mColourSet);
}
private void getColourPickerFragment() {
if (mPagerAdapter == null) return;
mColourPicker = (FragmentColourPicker) mPagerAdapter.getItem(0);
if(mColourSet != null) mColourPicker.setColourSet(mColourSet);
}
public class PickersPagerAdapter extends FragmentPagerAdapter
{
PickersPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return new FragmentColourPicker();
case 1:
return new FragmentSymbolPicker();
default:
return null;
}
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return getResources().getString(R.string.colours);
case 1:
return getResources().getString(R.string.symbols);
}
return null;
}
}
Файл макета для этого содержит:
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Current + adjacent page titles...-->
<android.support.v4.view.PagerTitleStrip
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:background="#33b5e5"
android:paddingBottom="4dp"
android:paddingTop="4dp"
android:textColor="#fff" />
</android.support.v4.view.ViewPager>
Первый фрагмент, использованный в этом пейджере, - FragmentColourPicker
.Он определяется следующим образом:
public class FragmentColourPicker extends Fragment {
GridView mColourGrid;
Context mContext;
ColourSet mColourSet;
ChartColourAdapter mColourAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_colour_picker, container, false);
mColourGrid = view.findViewById(R.id.gridview_colourPicker);
initialiseWithColourSet(); // Returns without doing anything if colourSet is not set up yet
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mContext = getActivity();
}
@Override
public void onDestroy(){ super.onDestroy();}
public void setColourSet(ColourSet thisColourSet) {
mColourSet = thisColourSet;
initialiseWithColourSet(); // Returns without doing anything if the colourGrid is not set up yet
}
public void initialiseWithColourSet() {
// Make sure that the colourSet and the colourGrid have both been initialised
if(mColourSet == null) return;
if(mColourGrid == null) return;
// Now set up ChartColourAdapter to display colours in grid
// Initialise currently highlighted colour to default
// Set on click listener for each colour
mColourAdapter = new ChartColourAdapter(mContext,
R.layout.adapter_pattern_colour_cell_layout,
mColourSet.getColours());
mColourGrid.setAdapter(mColourAdapter);
}
}
и файл макета для FragmentColourPicker
(frag_colour_picker.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/colour_picker_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/fui_transparent"
android:orientation="vertical">
<GridView
android:id="@+id/gridview_colourPicker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorBg"
android:paddingBottom="@dimen/activity_standard_margin"
android:columnWidth="@dimen/grid_cell_column_width"
android:gravity="center"
android:horizontalSpacing="10dp"
android:numColumns="auto_fit"
android:padding="@dimen/activity_small_margin"
android:stretchMode="columnWidth"
android:verticalSpacing="10dp" />
<TextView
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/prompt_swipe_for_symbols"
android:padding="@dimen/activity_small_margin"
android:background="@color/colorBg"
/>
</LinearLayout>
Когда я запускаю все это, появляется DialogFragment
когда кнопка нажата, и показывает FragmentColourPicker
.Я могу провести до FragmentSymbolPicker
и обратно.Однако единственное, что отображается в ColourPicker - это TextView
, который предлагает пользователю провести пальцем по экрану, чтобы увидеть символы.GridView
с фактическими цветами в нем вообще не отображается.
Из отладчика, я думаю, проблема в том, что initialiseWithColourSet
, кажется, только когда-либо имеет colourSet
ИЛИ colourGrid
.- Никогда оба.Это возвращает его, не пытаясь настроить цветовой адаптер.
Если onCreateView
вызывается initialiseWithColourSet
, тогда устанавливается colourGrid, а colourSet - нет (так как он еще не был передан),Это достаточно разумно.Однако, когда colourSet передается позже (из DialogFragment), colourGrid возвращается к нулю, поэтому снова функция возвращается, ничего не делая.
У меня явно что-то не в том порядке, или яинициализация colourGrid / ColourPicker без ее реализации.