【问题标题】:ArrayList empty after passing via Bundle to Fragment通过 Bundle 传递给 Fragment 后 ArrayList 为空
【发布时间】:2017-11-21 12:39:17
【问题描述】:

将ArrayLists放入Bundle并为接收它的片段设置参数的方法

public void finishButtonPressed(){
    ivFinish.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            MusicFragment fragment = new MusicFragment();
            Bundle bundle = new Bundle();
            bundle.putParcelableArrayList("prgmUri", prgmUri);
            bundle.putStringArrayList("prgmName", prgmName);
            bundle.putStringArrayList("prgmNumber", prgmNumber);
            fragment.setArguments(bundle);

            Intent intent = new Intent(getApplicationContext(), WorkoutPreStart.class);
            startActivity(intent);
        }
    });
}

必须接收 ArrayLists 的 Fragment

public class MusicFragment extends Fragment{
MediaPlayer mediaPlayer;
ImageView ivBack;
ImageView ivPlay;
ImageView ivNext;
TextView tvTitle;
ArrayList<String> prgmName;
ArrayList<String> prgmNumber;
ArrayList<Uri> prgmUri;



@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_music, container, false);
    ivBack = (ImageView) view.findViewById(R.id.ivBack);
    ivPlay = (ImageView) view.findViewById(R.id.ivPlay);
    ivNext = (ImageView) view.findViewById(R.id.ivNext);
    tvTitle = (TextView) view.findViewById(R.id.tvTitle);


    mediaPlayer = new MediaPlayer();
    prgmName = new ArrayList<>();
    prgmNumber = new ArrayList<>();
    prgmUri = new ArrayList<>();


    int namesize = prgmName.size();
    Log.v("namesize: ", prgmName.size()+ "");

    for(int i = 0; i<namesize; i++) {
        Log.v("Name: ", prgmName.get(i));
    }

    return view;
}

@Override
public void onStart() {
    super.onStart();

}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    Bundle bundle = this.getArguments();
    if(bundle != null) {
        prgmName = bundle.getStringArrayList("prgmName");
        prgmUri = bundle.getParcelableArrayList("prgmUri");
        prgmNumber = bundle.getStringArrayList("prgmNumber");
    }
    Toast toast = Toast.makeText(getActivity(), prgmName.get(1) +"", Toast.LENGTH_SHORT);
    toast.show();
    super.onActivityCreated(savedInstanceState);
}}

我认为有一个空的 ArrayList 的原因是 onCreateView 中的部分:

mediaPlayer = new MediaPlayer();
prgmName = new ArrayList<>();
prgmNumber = new ArrayList<>();
prgmUri = new ArrayList<>();

但如果我不这样做,我会收到NullpointerException。即使这个问题很简单,请帮助我,因为我已经花了10多个小时试图解决这个问题......:|

【问题讨论】:

  • 那么问题是当你必须在片段之间而不是片段和活动之间传递数据时,你正在打开一个不同的类 setargument()

标签: java android android-fragments arraylist


【解决方案1】:

问题是您没有将创建的MusicFragment 添加到您的活动中。 你可以在2 ways:

  • 动态通过FragmentTransaction,或
  • 静态通过 Activity 的布局文件

我假设您的MusicFragment 已添加到活动布局的WorkoutPreStart 中。在这种情况下,您可以将捆绑包添加到 Activity 的 Intent 中,然后将 pass 它添加到来自 Activity 的片段中。

【讨论】:

  • 我的“MusicFragment”被添加到“WorkoutStart”“通过活动的布局文件静态”。那就是我需要片段的活动。 'WorkoutPreStart' 类只是一个用于启动 'WorkoutStart' 和 'MusicActivity' 的 Activity
  • 直接通过 Intent 传递 List 和通过 Intent 传递包含 List 的 Bundle 有什么区别?
猜你喜欢
  • 2012-10-22
  • 2016-12-03
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
相关资源
最近更新 更多