Android 具有一个片段的多布局viewpager
我必须明确,我正在寻找一个示例或答案,在该示例或答案中,我可以在viewpager中使用各种不同的布局设计,并且所有页面中的数据都是动态的,并且所有页面都可以由用户交互。 我的用例和当前解决问题的方法: 因此,我有8种不同类型的问题类型,因此我为所有这些问题创建了Android 具有一个片段的多布局viewpager,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我必须明确,我正在寻找一个示例或答案,在该示例或答案中,我可以在viewpager中使用各种不同的布局设计,并且所有页面中的数据都是动态的,并且所有页面都可以由用户交互。 我的用例和当前解决问题的方法: 因此,我有8种不同类型的问题类型,因此我为所有这些问题创建了layouts。此外,这些布局视图中的数据必须通过从sqlite数据库获取数据的javaMap填充 但一个测试可能包含上述8个问题中的25个不同布局的问题。对于所有这25个问题,我想使用一个Viewpager和一个Fragment,它将
layouts
。此外,这些布局视图中的数据必须通过从sqlite数据库获取数据的javaMap
填充
但一个测试可能包含上述8个问题中的25个不同布局的问题。对于所有这25个问题,我想使用一个Viewpager
和一个Fragment
,它将根据从java映射中传递的问题类型值返回所需的布局
我对此的看法:
我创建了一个活动,并使用viewpager布局对其进行了扩展:
R.layout.练习寻呼机
*活动编辑代码*
TestFragment编辑代码
公共类TestFragment扩展了片段{
AnswerEnterListener callBack;
FragmentData fD;
Button submitAnswer;
EditText userAnswer;
TextView qText,expl;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.qtype1, container, false);
}
public interface AnswerEnterListener
{
public void onInputAnswer(String ans);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
callBack=(AnswerEnterListener) activity;
fD=(FragmentData) activity;
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
qText=(TextView) getActivity().findViewById(R.id.question_text);
expl=(TextView)getActivity().findViewById(R.id.explanation_text);
qText.setText(Html.fromHtml(fD.getData().getQUES()));
expl.setText(Html.fromHtml(fD.getData().getEXPL()));
}
}
与TestFragment类似,我也没有其他片段。每种都对应一种布局类型。
问题:
- 第一个布局在第一次重复两次,而且当我向后滑动时,数据的位置被放错了位置
- 这是正确的方法吗?有人建议我应该使用三个片段,并用数据更新左右片段,但这确实让我感到震惊。任何人都可以分享一个好的例子或博客
ViewPager
并设置其适配器。适配器将在getItem()
方法中返回正确的片段实例,具体取决于您的条件
在片段中,从应该通过某种方法公开数据的活动中检索数据
我举了一个简单的例子,你可以找到。你基本上想要实现一个测验应用程序,其中最多可以有8种类型的问题(8种不同的问题布局),对吗?所有页面中的数据都是动态的-动态程度如何?您是否计划在创建片段后对其进行更改?所有页面都可以由用户交互。-互动是什么意思?是的,你是对的,我想实施一个测验。动态数据意味着数据将来自sqlite数据库或映射,但不是硬编码的。是的,一旦片段被创建,我想用我的集合中的数据填充它。有些页面和按钮上都有编辑文本,比如提交答案,这样就可以进行交互。@Luksprog您是否打算提出一些建议,因为我想编辑上面的代码,使之符合我现在正在做的事情。更新问题。你的代码太复杂了,无法完成你想做的事情。@Luksprog看一下我的编辑,实际上现在我已经为每个布局创建了片段,并创建了一个片段列表,在需要时返回所需的布局。对于我的用例来说,这是正确的方法吗?这种方法的问题是,我无法在我的viewpagerGot中更新页面滑动上的数据。事实上,我在
onActivityCreated
中初始化视图时犯了错误,尽管onCreateView
,但您的这种方法确实有所帮助。感谢您的时间和宝贵的意见
public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter{
private List<Fragment> fragments;
public MyFragmentPagerAdapter(FragmentManager fm,List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int position) {
System.out.println("value of position "+position);
return this.fragments.get(position);
}
/** Returns the number of pages */
@Override
public int getCount() {
return this.fragments.size();
}
@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return MyFragmentPagerAdapter.POSITION_NONE;
}
}
public interface FragmentData {
public void setData(GrePracticeTestRecord p);
public GrePracticeTestRecord getData();
}
AnswerEnterListener callBack;
FragmentData fD;
Button submitAnswer;
EditText userAnswer;
TextView qText,expl;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.qtype1, container, false);
}
public interface AnswerEnterListener
{
public void onInputAnswer(String ans);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
callBack=(AnswerEnterListener) activity;
fD=(FragmentData) activity;
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
qText=(TextView) getActivity().findViewById(R.id.question_text);
expl=(TextView)getActivity().findViewById(R.id.explanation_text);
qText.setText(Html.fromHtml(fD.getData().getQUES()));
expl.setText(Html.fromHtml(fD.getData().getEXPL()));
}