如何在 dialogFragment 内的 viewPager 内的片段中填充适配器?
How can I populate an adapter in a fragment which is within a viewPager within a dialogFragment?
我正在尝试创建以下场景:
用户点击了 Button
> 这显示了 DialogFragment
DialogFragment
包含一个 ViewPager
,它有 2 个选项卡 - 一个显示颜色选择器片段,另一个显示符号选择器片段
每个选择器片段都包含一个适配器,可将 colours/symbols 的数组转换为漂亮的网格。
但是,它目前显示为空白 - DialogFragment
与片段的其他部分一起出现,但没有适配器视图。
这是我的:
最初的activity被称为EditActivity
。它有一个 Button
,单击它时,调用此函数以显示 DialogFragmentPickers
:
public void showPickers() {
if(mDialogFragmentPickers == null) return;
mDialogFragmentPickers.setColourSet(mColourSet);
mDialogFragmentPickers.show(mFragmentManager, "Pickers");
}
DialogFragmentPickers
在 EditActivity
的 onCreate
方法中初始化如下:
mDialogFragmentPickers = new DialogFragmentPickers();
传入的 ColourSet
基本上只是要在选择器中显示的颜色数组。 DialogFragmentPickers
然后应该在初始化时将其传递给 FragmentColourPicker
。
DialogFragmentPickers
class 看起来像这样(我只展示了与 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
(fragment_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
- 从来没有。这使得 return 无需尝试设置颜色适配器。
如果从 onCreateView
调用 initialiseWithColourSet
,则会设置 colourGrid,但不会设置 colourSet(因为尚未传入)。这很合理。但是,当稍后(从 DialogFragment)传入 colourSet 时,colourGrid 变回 null,因此函数 returns 又没有做任何事情。
我显然顺序有误,或者我在没有意识到的情况下重新初始化了 colourGrid / ColourPicker。
我觉得这像是订单问题。为确保您在正确的时间将数据获取到 Fragment
,我会通过构造函数将片段所需的数据传递到 Adapter
。我会在那里保留对它们的引用,然后使用静态 newInstance(... requiredData)
方法实例化片段。然后,您可以确定当他们被适配器 "created" 时,他们将拥有所需的信息。
像这样:
你的片段class:
...
Object myRequiredData;
static FragmentColourPicker newInstance(... requiredData) {
FragmentColourPicker f = new FragmentColourPicker();
f.setRequiredData(requiredData);
return f;
}
public void setRequiredData(Object reqData){
this.myRequiredData = reqData;
}
...
您的适配器class:
public class PickersPagerAdapter extends FragmentPagerAdapter {
Object reqData0;
Object reqData1;
PickersPagerAdapter(FragmentManager fm, Object reqData0, Object reqData1) {
super(fm);
this.reqData0 = reqData0;
this.reqData1 = reqData1;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return FragmentColourPicker.newInstance(reqData0);
case 1:
return FragmentSymbolPicker.newInstance(reqData1);
default:
return null;
}
}
...
}
我正在尝试创建以下场景:
用户点击了 Button
> 这显示了 DialogFragment
DialogFragment
包含一个 ViewPager
,它有 2 个选项卡 - 一个显示颜色选择器片段,另一个显示符号选择器片段
每个选择器片段都包含一个适配器,可将 colours/symbols 的数组转换为漂亮的网格。
但是,它目前显示为空白 - DialogFragment
与片段的其他部分一起出现,但没有适配器视图。
这是我的:
最初的activity被称为EditActivity
。它有一个 Button
,单击它时,调用此函数以显示 DialogFragmentPickers
:
public void showPickers() {
if(mDialogFragmentPickers == null) return;
mDialogFragmentPickers.setColourSet(mColourSet);
mDialogFragmentPickers.show(mFragmentManager, "Pickers");
}
DialogFragmentPickers
在 EditActivity
的 onCreate
方法中初始化如下:
mDialogFragmentPickers = new DialogFragmentPickers();
传入的 ColourSet
基本上只是要在选择器中显示的颜色数组。 DialogFragmentPickers
然后应该在初始化时将其传递给 FragmentColourPicker
。
DialogFragmentPickers
class 看起来像这样(我只展示了与 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
(fragment_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
- 从来没有。这使得 return 无需尝试设置颜色适配器。
如果从 onCreateView
调用 initialiseWithColourSet
,则会设置 colourGrid,但不会设置 colourSet(因为尚未传入)。这很合理。但是,当稍后(从 DialogFragment)传入 colourSet 时,colourGrid 变回 null,因此函数 returns 又没有做任何事情。
我显然顺序有误,或者我在没有意识到的情况下重新初始化了 colourGrid / ColourPicker。
我觉得这像是订单问题。为确保您在正确的时间将数据获取到 Fragment
,我会通过构造函数将片段所需的数据传递到 Adapter
。我会在那里保留对它们的引用,然后使用静态 newInstance(... requiredData)
方法实例化片段。然后,您可以确定当他们被适配器 "created" 时,他们将拥有所需的信息。
像这样:
你的片段class:
...
Object myRequiredData;
static FragmentColourPicker newInstance(... requiredData) {
FragmentColourPicker f = new FragmentColourPicker();
f.setRequiredData(requiredData);
return f;
}
public void setRequiredData(Object reqData){
this.myRequiredData = reqData;
}
...
您的适配器class:
public class PickersPagerAdapter extends FragmentPagerAdapter {
Object reqData0;
Object reqData1;
PickersPagerAdapter(FragmentManager fm, Object reqData0, Object reqData1) {
super(fm);
this.reqData0 = reqData0;
this.reqData1 = reqData1;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return FragmentColourPicker.newInstance(reqData0);
case 1:
return FragmentSymbolPicker.newInstance(reqData1);
default:
return null;
}
}
...
}