【问题标题】:Getting data from fragment without loading the view从片段获取数据而不加载视图
【发布时间】:2017-08-23 13:38:24
【问题描述】:

我在一个活动中包含三个片段。此活动中的三个文本视图。我在每个片段中都有三个 API 调用。我需要三个片段中创建的 ArrayList 的计数。我试图在活动中进行 API 调用,并试图从那里找出 ArrayList 并将其传递给片段。但我不知道如何将这种类型的 ArrayList(Arraylist 数组)传递给片段。我在活动中只需要三个整数值。所以问题是,

1) 请给我一种将值从三个片段传递给活动的方法,方法是实际加载一个片段的视图并在没有视图的情况下加载片段的其余部分。

2) 或者给我一种方法,将在活动中创建的模型类的 ArrayList 传递给三个片段。

【问题讨论】:

  • 添加一些代码 sn-p 以便人们可以帮助您,,
  • 我的代码是机密的,这就是为什么对此感到抱歉,但现在的答案对我有所帮助,试图解决这个问题,并会在我得到它后立即更新,谢谢你的回复 :)

标签: java android android-fragments android-activity arraylist


【解决方案1】:

1 - 从片段中获取数组的大小:

在这种情况下,您需要获取添加片段的实例,并从它的全局变量中检索您需要的值。

在片段中:

public List<MyObject> myList;

活动中:

int size;
MyFragment fragment = (MyFragment)getSupportFragmentManager().findFragmentByTag("myFragmentTag");
if(fragment != null && is fragment.isAdded())
    size = fragment.myList.size();

PS:在上面的情况下,添加时不要忘记在片段中添加标签

2 - 将数组传递给片段:

在这种情况下,您需要使 Object Serializable,将其作为参数添加到即将添加的 Fragment 中,然后在添加 Fragment 时,在 Fragment 内检索先前添加的 Object

使对象可序列化并将其添加到 Activity 的参数中

活动中:

public MySerializableObjectList myList;

将数组添加到Activity中的fragment:

MyFragment myFragment = new MyFragment();
fragmentManager = getSupportFragmentManager();
Bundle bundle = new Bundle();
bundle.putSerializable("myArrayTag", myList);
myFragment.setArguments(bundle);
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_container, myFragment,"myFragmentTag").commit();

在片段中:

public MySerializableObjectList myList;
if(getArguments != null)
    myList = (MySerializableObjectList)getArguments().getSerializable("myArrayTag");

List<MySerializableObject> myListObject;
if(myList != null)
    myListObject = myList.getMySerializableObjectList();

【讨论】:

  • 我的模型类实现了 parcelable,所以我想像这个那样做,但是有什么方法可以像函数调用或 @jhon-fredy-trujillo 所说的那样
  • 不使用 putParceable 和 getParceable 设置 putSerializable 和 getSerializable,它的工作方式相同
  • 很高兴为您提供帮助:)
【解决方案2】:

putParcelableArrayList 和 getParcelableArrayList 槽 Bundle 中的 Fragment 参数。

【讨论】:

  • 我正在寻找另一种方法其实还是谢谢你:)
  • 使用了这种方法,@Ricardo 的回答更有帮助,给了我清晰的想法,谢谢马科斯。 :)
  • 没问题,但你应该实现 Parcelable 而不是 Serializable
  • 是的,我使用 parcelable 而不是 serializable 很高兴你帮助了 :)
【解决方案3】:

好吧,让我们看看。在我看来,最好的方法是查询活动中的信息并将其传递给片段,这意味着您提出的第二种方式。

要做到这一点,请按照以下步骤操作 1)在活动的onCreate方法中获取List。 2)在片段中,创建一个变量和一个从活动中接收对象的方法。

public class FormFragment extends Fragment {
List<Object> data;
 public FormFragment() {
    // Required empty public constructor
} 
public void initFragment(List<Object> data){
this.data = data
}
}

3) 创建片段后,使用此方法将信息传递给片段

public class Activity extends AppCompat{
List<Object> data = //Query your data here  
/....

 FormFragment fragment = new FormFragment()
 fragment.init(data)
}

仅此而已,您可以通过这种方式传递信息并顺利运行,此外,您还可以使用来自活动的数据作为您的祝福。

【讨论】:

  • Fragment fragment = new FormFragment() fragment.init(data) //当我输入 fragment.initFragment 时这不起作用,它没有显示我将方法公开
  • 哦,是的,让我为您编辑 aswer。记住这是一个例子,你必须改变你的代码。
猜你喜欢
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多