【问题标题】:how to access list of fragment from another activity?如何从另一个活动访问片段列表?
【发布时间】:2016-01-17 00:39:51
【问题描述】:

我有一个包含项目列表的片段。我想从另一个活动访问该列表,该活动在用户输入编辑文本并保存该项目时在列表中添加项目。这个项目应该被添加到片段列表中。我怎样才能做到这一点?如何从另一个活动访问片段中创建的列表?

片段

public class ItemFragment extends Fragment {

    RecyclerView recyclerView;

    IAdapter adapter;
    ArrayList<Expense> items;

    public ItemFragment() {
    }

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

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_item_list, container, false);
        setHasOptionsMenu(true);
        Expense e = new Expense();

        recyclerView = (RecyclerView) view.findViewById(R.id.RecyclerView);
        ImageButton imageButton = (ImageButton) view.findViewById(R.id.imgbtn_fab);
        LinearLayoutManager llm = new LinearLayoutManager(this.getActivity());


        items=new ArrayList<>();
        recyclerView.setLayoutManager(llm);

        recyclerView.setHasFixedSize(true);

        initializeDataType1();
        adapter = new IAdapter(getActivity(),items);
        recyclerView.setAdapter(adapter);


        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(ItemFragment.this.getActivity(), Main2Activity.class);
                startActivity(intent);


            }
        });
        return view;
    }

    private void initializeDataType1() {

        items.add(new Expense("1000", "2000", 1));
        items.add(new Expense("2000", "5000", 1));
        items.add(new Expense("3000", "400", 2));
        items.add(new Expense("1000", "4000", 1));
        items.add(new Expense("3000", "3000", 2));
        items.add(new Expense("2000", "100", 1));
        items.add(new Expense("2000", "3333", 2));
        items.add(new Expense("3000", "shopping", 1));
        items.add(new Expense("1000", "food", 1));
        items.add(new Expense("1000", "food", 2));
        items.add(new Expense("2000", "drink", 1));
        items.add(new Expense("3000", "shopping", 2));
        items.add(new Expense("2000", "3333", 1));
        items.add(new Expense("3000", "shopping", 1));
        items.add(new Expense("1000", "food", 1));
        items.add(new Expense("1000", "food", 1));
        items.add(new Expense("2000", "drink", 1));
        items.add(new Expense("3000", "shopping", 1));
    }
}

活动

public class Main2Activity extends Activity {

    public Expense ex;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        final EditText amt=(EditText)findViewById(R.id.editText);
       final  EditText exp=(EditText)findViewById(R.id.editText2);
      final  EditText typ=(EditText)findViewById(R.id.typ);


        Button save=(Button)findViewById(R.id.addamt);


        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String amount = amt.getText().toString();
                String expense = exp.getText().toString();
                int type=(Integer.parseInt(typ.getText().toString()));

                Toast.makeText(getApplicationContext(),
                        "Saved",
                        Toast.LENGTH_LONG).show();


            }
        });

    }
}

请帮忙...

【问题讨论】:

    标签: java android list android-activity


    【解决方案1】:

    将该列表传递给 Activity,进行更改,将列表传回片段并显示新列表。

    【讨论】:

      【解决方案2】:

      只需在返回此列表的 Fragment 上创建一个公共方法。

      然后获取对您的片段的引用并调用该方法。

      【讨论】:

        【解决方案3】:

        根据官方文档,无法从其他活动访问片段:

        您可以将片段视为活动的模块化部分,它有自己的生命周期,接收自己的输入事件,您可以在活动运行时添加或删除它(有点像“子活动”可以在不同的活动中重复使用)。

        片段必须始终嵌入到活动中,并且片段的生命周期直接受宿主活动生命周期的影响。比如activity暂停的时候,里面的所有fragment都会暂停,activity销毁的时候,所有的fragment也会暂停。

        但是,您可以将列表传递给 Intent 中的第二个 Activity:

        Intent intent = new Intent(ItemFragment.this.getActivity(),Main2Activity.class);
        intent.putExtra("key", items);
        getActivity().startActivity(intent);
        

        在您的 Main2Activity onCreate() 中:

        items = (ArrayList<Expense>) getIntent().getSerializableExtra("key");
        

        可以任意选择密钥。请记住,您将收到一份列表的副本,而不是实际的对象。

        【讨论】:

        • 当我在第二个活动中传递列表时,它在项目片段上显示错误,它不是封闭类
        【解决方案4】:

        您可以将片段列表的对象用作指针并将此指针发送给 Main2Activity。当片段再次可见时,只需刷新 recyclerview。例如像这样启动 Main2Activity:

        Intent intent = new Intent(context, Main2Activity.class);
        Bundle bundle  = new Bundle();
        bundle.putSerializable("list", items);
        intent.putExtras(bundle);
        context.startActivity(intent);
        

        并且在您的 onCreate() 方法中接收此列表指针并添加项目。完成活动并恢复片段后,只需刷新recyclerview即可。

        【讨论】:

        • 它显示无法解析 bundle.putSerializable("list", items) 中项目的符号;以及如何刷新回收站视图?
        • 你在哪里调用 Main2Activity
        • 要刷新 recyclerView,您可以重新初始化适配器并将其重置为 recyclerview。
        • Main2Activity 从 ItemFragment 调用
        • items 是您正在处理的列表。如果您将上述代码行放入您的 ItemFragment 中,一切都应该没问题。
        【解决方案5】:

        假设您从用户那里获取数据后不需要 Activity 类。如果是这种情况,请使用 startActivityForResult 从 Fragment 启动 Activity。当用户输入完所有的 EditText 字段并点击 Save 然后将所有数据设置为一个包和finish() Activity。现在从您的 Fragment 的onActivityResult 获取数据并相应地更新列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多