android-fragments - 更新 fragment 参数的最佳实践?

  显示原文与译文双语对照的内容
0 0

我知道关于" newInstance " Pattern ( Best实践。实例化新Android Fragment ) 。? 但如何更新这些参数例如如果另一个片段一个片段的变化数据?

我知道回调方法之间Fragments/Activitys,但这些回调不会更新参数- !

例如: 在创建的片段我传递一个URI it与包。 然后另一个片段更改此URI通过changeUri( Uri uri ) 方法回调上第一个片段。 如果再被fragment重新创建( 例如由于屏幕旋转) 它将使用第一个URI从参数bundle而不是后续更新uri,是否正确?

解决此问题的最佳实践是什么? 我必须手动将其存储在savedInstanceState和用法上决定是否使用instanceState或参数包?

我在找我的碎片处理参数的标准方式,因此我认为我会用这样的方式( 伪代码) :

private Uri arg1;
public static Fragment newInstance(Uri arg1) {
  create bundle
  create fragment instance
  set bundle to fragment
  return fragment
}
private void onCreate(Bundle savedInstance) {
  if(savedInstance != null) {
    arg1 = savedInstance.uri
  }
}
private Uri getUri() {
  if(arg1 == null) {
    arg1 = getArguments.uri
  }
  if(arg1 == null) {
    arg1 = defaultValue
  }
}

我还有些客户只需统一方法访问我的参数。 而且不必使用if else麻烦,每次我需要该参数。

你觉得在哪里了?

时间:原作者:9个回答

0 0

你无法更改其设置参数后, Fragment将被添加到 Activity,我使用类似的方法来定义自己。 我首先检查了 Bundle传递给 onCreate()如果它们不为空我使用它,但是如果它为null,则使用参数。 我不管是一个新型数据保存在 onSaveInstanceState(). 有关更多详细信息: Is元数据后,可以将参数传递给java片段被添加到活动

原作者:
0 0

在保存状态一样来帮Activities在Fragment的 onSaveInstanceState 回调。 如果已更新了URI自上次 onCreate(),可以将更新的URI存储在 Bundle年代,将得到这些 onCreate(). 正是这个专为保存状态,通过更改URI,所做的一切更改了状态。

原作者:
0 0

这样做的另一种方法是只需要使用SharedPreferences如下所示:

public static void setCurrentItem(int position, Context context) {
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
    Editor edit = pref.edit();
    edit.putString("unique_key", url);
    edit.commit();
}
public int getCurrentItem() {
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());
    return pref.getString("unique_key", "");
}

该方法为静态方法创建服务器设置值之前片段附加到activity 。

原作者:
0 0

根据你正在使用你的碎片可能的方式确定如何有效的战略将。

例如,如果你有许多碎片在公共tab/view页导航模式和当前管理通道与FragmentStatePagerAdapter可能有机会为你的活动或其他片段片段实例引用已不存在导致的空指针异常。

它可以操控解决此问题,如果不想写回调,是使用Intents和BroadcastReceivers ( 可能会有点overkill,难以管理,但是如果做到正确可节省大量头痛我的经验) 中发送和接收广播和从父活动。

关于一个美妙的意图就是能够进行调整,以工作在特定时间和extras包括包和地块可以接受广泛的数据对象。

原作者:
0 0

Best practice for updating arguments of a fragment: 为什么我们需要添加参数By NewInstance()方法&为什么是片段的最佳实践?

片段可以想想作为一个活动的模块化部分。 这意味着当我们创建片段,我们需要使其模块化&独立。

假设你需要一个片段需要一个参数所针对.We也可以写

MyFragmentClass mFrag = new MyFragmentClass();
Bundle bundle = new Bundle();
bundle.putString("key", value);
mFrag.setArguments(bundle);

它还运行正常&可以获取参数 onCreate方法。 这是不同之处在于你还可以让fragment没有参数的实例并将其添加到片段管理器但片段需求参数进行操作。 添加 newInstance方法中创建fragment时强制开发人员添加参数。 所以据说最佳操作。

你的问题中可以使用 setRetainInstance(boolean retain)无法在你的fragment不想销毁销毁活动时。

原作者:
0 0

我只是更改值捆绑 Example :

synchronized (fragment.getArguments()) {
        fragment.getArguments().putInt(KEY, new Value);
    }

并更新流进行Argument

原作者:
...