gpt4 book ai didi

java - Android 中的 Fragments 和 ViewPager

转载 作者:行者123 更新时间:2023-11-30 03:27:51 24 4
gpt4 key购买 nike

我有一个 ViewPager 允许用户在 5 个不同的 View 之间滑动,其中每个“ View ”都扩展了 Fragment。

我有自己的适配器,它扩展了 FragmentPagerAdapter 并将 getItem() 实现为

@Override public Fragment getItem(int position) {
switch(position) {
case 0:
return new TextDescriptionFragment();
// Handle the 4 other cases the same way
}
}

这很好用,用户可以在 5 个不同的 View 之间滑动。但是问题来了:前 4 个 View 中的每一个都包含用户可以与之交互的 View ,例如 Button 和 EditText。

然后我希望最后一页(第 5 页)显示前 4 页( fragment )的所有 View 中的所有用户输入值。我怎么做?

我找不到任何方法来从前面的 fragment 中读取用户输入值。 View 甚至可能不再存在(但如果用户返回,将重新创建)。

而且我似乎无法获取现有的 fragment 。

最佳答案

我会考虑拥有一个自定义对象来保存每个 fragment 填充的数据。像这样的东西:

public class FillerData implements Parcelable {
private String page0$data0;
private String page0$data1;
private String page0$data2;

// getters and setters if you wish

// implement Parcelable interface as this object will be managed by host activity
}

您将只有一个这样的对象由父 Activity 管理,父 Activity 将实现一个接口(interface)来公开该对象:

public static interface FillerDataExposer {
public FillerData exposeFiller();
}

public class MyFragmentHostActivity extends FragmentActivity implements FillerDataExposer {
private static final String FILLER_KEY = "FILLER_KEY";
private FillerData myFillerData;

protected void onCreate(Bundle savedInstance) {
.......
if(savedInstance != null) {
myFillerData = (FillerData) savedInstance.getParcelable(FILLER_KEY);
} else {
myFillerData = new FillerData();
}
}

protected void onSaveInstanceState(Bundle savedInstance) {
super.onSaveInstanceState();
savedInstance.putExtra(FILLER_KEY, myFillerData);
}

public FillerData exposeFiller() {
return this.myFillerData;
}
}

现在,您的每个 fragment 都可以通过父 Activity 访问该集中式数据填充对象。为了减少代码的重量,您的所有 fragment 都可以从提供对 FillerDataExposer 实现(实际上是父 Activity )访问权限的 fragment 基类扩展:

public abstract class AbstractFillerFragment extends Fragment {
protected FillerDataExposer dataExposer;

public void onAttach(Activity act) {
super.onAttach(act);
// make sure no ClassCastExceptions
this.dataExposer = (FillerDataExposer) act;
}
}

只应记录填充数据的 fragment 可能如下所示:

public class Page1Fragment extends AbstractFillerFragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = // inflate XML resource ...
yourEditText = (EditText) view.findViewById(...);
// other relevant code ....
}

public void onViewCreated(View view, Bundle savedInstanceState) {
yourEditText.setText(dataExposer.exposeFiller.setPageX$DataY());
// some code for EditText.addTextChangedListener(new TextWatcher() could look like:
yourEditText.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {

dataExposer.exposeFiller().setPage1$Data0(s.toString());

}

public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
}
}

虽然需要访问所有存储数据的 fragment 可能如下所示:

public class FinalFragment extends AbstractFillerFragment {
public void collectAllData() {
DataFiller allDataCollectedObject = dataExposer.exposeFiller();
// by calling get...() you should have access to collected data.
}
}

这只是一个草图,但您会得到图片。这个想法是让您的 Activity 中的单个对象在 Activity 重新启动时得到管理,并使其可以通过接口(interface)访问,这样您就会尊重 Activity 模式的 fragment 。

希望这是有道理的......

关于java - Android 中的 Fragments 和 ViewPager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17948447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com