【问题标题】:Tablayout / Viewpager: Passing data in between fragmentsTablayout / Viewpager:在片段之间传递数据
【发布时间】:2016-03-25 06:46:12
【问题描述】:

我在 tablayout/viewpager 的片段之间传递数据时遇到问题。我有一个带有四个选项卡的 Tablayout,并且使用 viewpager 启用了切换。我正在尝试从 FirstTabFragment、SecondTabFragment 和 ThirdTabFragment 保存数据,并在最后一个选项卡 = ReviewFragment 中检索它们。我已经实现了将数据保存到 SharedPreferences 中,这适用于第一个和第二个片段,第三个片段中的数据没有保存,并且在打开 ReviewFragment 时显示为空。

FirstFragment是一个Listview,被选中的listview项中的字符串被保存。 SecondFragment,是一个editText,输入的值在按下下一个按钮时保存。 ThirdFragment 也是一个 Listview,FirstFragment 中的代码与此片段中的代码相同,但没有按预期工作。

我所说的不按预期工作的意思是: ThirdFragment 中的值实际上保存 到 SharedPreferences 中,但没有检索 在打开 ReviewFragment 时立即执行。我知道这一点是因为当我关闭应用并重新打开它时,它会显示 SharedPreferences 中保存的值。

下面是来自 ThirdFragment 和 ReviewFragment 的代码

第三片段

  private SharedPreferences memory1;
    private SharedPreferences.Editor edt1;

    private ListView listView;
    private ArrayAdapter<String> listAdapter;

    public MtnPaymentMtdFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.payment_method, container, false);



        // Find the ListView resource.
        listView = (ListView) v.findViewById(R.id.mtn_plv);

        // Create and populate a List
        String[] p_method = new String[]{"ATM - MasterCard - Visa - Verve", "Online Bank Transfer", "Bank Deposit", "Recharge Card", "Mobile Banking"};
        ArrayList<String> p_methods = new ArrayList<String>();
        p_methods.addAll(Arrays.asList(p_method));

        // Create ArrayAdapter using the list.
        listAdapter = new ArrayAdapter<String>(this.getActivity(), R.layout.item_row3, p_methods);

        // Set the ArrayAdapter as the ListView's adapter.
        listView.setAdapter(listAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                String selectedFromList = (listView.getItemAtPosition(i).toString().trim());

                switch (i) {
                    case 0:
                        MtnReviewFragment fragment = new MtnReviewFragment();
                        Bundle bundler = new Bundle();
                        bundler.putString("payment_mtd", selectedFromList);
                        fragment.setArguments(bundler);
//                        memory1 = getActivity().getPreferences(0);
//                        edt1 = memory1.edit();
//                        edt1.putString("payment_mtd", selectedFromList);
//                        edt1.apply();
                        ((MtnActivity) getActivity()).setCurrentItem(3, true);
                        break;
                    case 1:
//                        String selectedFromList1 = (listView.getItemAtPosition(i).toString().trim());
                        memory1 = getActivity().getPreferences(0);
                        edt1 = memory1.edit();
                        edt1.putString("payment_mtd", selectedFromList);
                        edt1.apply();
                        ((MtnActivity) getActivity()).setCurrentItem(3, true);
                        break;
                    case 2:
//                        String selectedFromList2 = (listView.getItemAtPosition(i).toString().trim());
                        memory1 = getActivity().getPreferences(0);
                        edt1 = memory1.edit();
                        edt1.putString("payment_mtd", selectedFromList);
                        edt1.apply();
                        ((MtnActivity) getActivity()).setCurrentItem(3, true);
                        break;
                    case 3:
//                        String selectedFromList3 = (listView.getItemAtPosition(i).toString().trim());
                        memory1 = getActivity().getPreferences(0);
                        edt1 = memory1.edit();
                        edt1.putString("payment_mtd", selectedFromList);
                        edt1.apply();
                        ((MtnActivity) getActivity()).setCurrentItem(3, true);
                        break;
                    case 4:
//                        String selectedFromList4 = (listView.getItemAtPosition(i).toString().trim());
                        memory1 = getActivity().getPreferences(0);
                        edt1 = memory1.edit();
                        edt1.putString("payment_mtd", selectedFromList);
                        edt1.apply();
                        ((MtnActivity) getActivity()).setCurrentItem(3, true);
                }
            }
        });
        return v;
    }
}

评论片段

private SharedPreferences memory;
private SharedPreferences.Editor edt;
private TextView rev_bundle_result;
private TextView rev_mob_result;
private TextView rev_pmtd_result;
public static SharedPreferences savedSharedPreference;
public static String filename = "nameValue";
private static final String REGISTER_URL = "http://zzzzzzzzz.com/xxxxx/register.php";


public MtnReviewFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.review_layout, container, false);
    rev_bundle_result = (TextView) v.findViewById(R.id.rev_bundle_result);
    rev_mob_result = (TextView) v.findViewById(R.id.rev_mob_result);
    rev_pmtd_result = (TextView) v.findViewById(R.id.rev_pmtd_result);
    Button make_payment = (Button) v.findViewById(R.id.make_payment_but);

    memory = getActivity().getPreferences(0);
    String bundles = memory.getString("bundle_name", "empty");
    String mob_number = memory.getString("mob_number", "empty");
    String payment_mtds = memory.getString("payment_mtd", "empty");
    String p_amount = memory.getString("amount", "empty");

    rev_bundle_result.setText(bundles);
    rev_mob_result.setText(mob_number);
    rev_pmtd_result.setText(payment_mtds);

【问题讨论】:

  • 第四个选项卡在您到达第三个布局后立即呈现。当用户切换到该选项卡时刷新您的第四个选项卡。 setUserVisibleHint

标签: android listview android-fragments android-listview android-viewpager


【解决方案1】:

这有点老了,你可能已经找到了解决方案,但以防万一其他人在这里结束并需要答案......

我认为您的问题可能是因为在您的 ReviewFragment 中,您在 onCreateView() 方法中从 SharedPreferences 获取数据。

当您滚动到 ThirdFragment 时,可能正在创建您的 ReviewFragment。 ViewPagers 通常会提前创建一些片段,以提高用户滚动时的性能。因此,当调用 ReviewFragment.onCreateView() 时,ThirdFagment 尚未将其数据保存到 SharedPreferences 中。向 ReviewFragment.onCreateView() 添加断点并检查是否发生了这种情况。

我认为您必须将 OnPageChangeListener 添加到您的 ViewPager 并让 ReviewFragment 仅在 SharedPreferences 变得可见时才从其获取数据。另外,请查看 Fragment.setUserVisibleHint()。它曾经无法与 ViewPagers 一起正常工作,但我听说已经修复。

【讨论】:

    【解决方案2】:

    viewpager getview 方法的逻辑只创建没有自身的左右侧片段。你可以尝试设置页数限制setOffscreenPageLimit()

    但它没有用加载所有片段。也许这可以解决您的问题。

    【讨论】:

      【解决方案3】:

      Here是从fragment向tablayout/viewpagersfragment发送数据的解决方案。

      【讨论】:

        【解决方案4】:

        如果您想在继续之前确保更改已保存,请尝试使用commit() 而不是apply() 代替SharedPreferences

        apply() 异步进行更改,而commit() 同步保存更改。 https://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()

        另外,我已经看到了您的代码,并且您调用并转换了您的容器活动,您应该使用 android 建议的侦听器模式。阅读指南或从这篇文章开始:Send data between fragments in a pagerAdapter

        【讨论】:

        • 我试过 Gonzalo,还是一样的。没用。
        • 尝试使用commit(),看看它会返回什么。
        • 谢谢 Gonzalo,但还是一样,我之前测试过。你认为可能是什么原因造成的。发送的数据不会立即显示在 ReviewFragment 中,但是当我关闭并重新打开应用程序时,会显示该值。我什至添加了一个进度对话框,因为我认为可能 sharedpreferences 需要几秒钟来保存值。但它仍然是一样的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-05
        • 2016-11-21
        • 1970-01-01
        相关资源
        最近更新 更多