簡體   English   中英

在片段之間傳遞數據

[英]Pass data between fragments

我有一個MainActivity和兩個片段。 在FragmentA中,我有一個回收站視圖。 如果我點擊那里的“添加”按鈕,FragmentB就會打開。 我想要的是將文本寫入一些EditTexts並將數據發送回FragmentA(並在回收器視圖中呈現該數據)。 你能給我一些建議嗎? 謝謝

FragmentB

public class NewContactFragment extends Fragment {

    EditText name, number, email;
    public String mName;
    public String mNumber;
    public String mEmail;
    boolean isFavourite = false;

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

    public static NewContactFragment newInstance() {
        NewContactFragment fragment = new NewContactFragment();
        Bundle bundle = new Bundle();
        fragment.setArguments(bundle);

        return fragment;

    }

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

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ButterKnife.bind(this, view);

        //set title
        ((MainActivity) getActivity()).getSupportActionBar().setTitle(R.string.new_contact);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_new_contact, container, false);

        name = (EditText) view.findViewById(R.id.ed_name);
        number = (EditText) view.findViewById(R.id.ed_number);
        email = (EditText) view.findViewById(R.id.ed_email);

        mName = name.getText().toString();
        mNumber = number.getText().toString();
        mEmail = email.getText().toString();

        return view;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.new_contact_menu, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_done:
                //TODO: save editTexts and return to ContactListFragment

                break;
            case R.id.action_favourite:
                getActivity().invalidateOptionsMenu();
                //Toast.makeText(getContext(), "isFavourite is: " + isFavourite, Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

FragmentA

public class ContactListFragment extends Fragment implements View.OnClickListener {

    private static final String TAG = "newcontact";
    FloatingActionButton fabButton;
    SearchView searchView;
    RecyclerView recyclerView;
    ContactsAdapter contactsAdapter;
    List<Contact> mContact = new ArrayList<>();

    public static ContactListFragment newInstance() {
        Bundle args = new Bundle();
        ContactListFragment fragment = new ContactListFragment();
        fragment.setArguments(args);
        return fragment;
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_contact_list, container, false);

        searchView = (SearchView) view.findViewById(R.id.search_view);
        fabButton = (FloatingActionButton) view.findViewById(R.id.fab_button);
        fabButton.setOnClickListener(this);

        recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mContact = SugarRecord.listAll(Contact.class);
        contactsAdapter = new ContactsAdapter(getActivity(), mContact);
        recyclerView.setAdapter(contactsAdapter);

        inputFilter();

        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ButterKnife.bind(this, view);

        //show actionBar
        ((MainActivity) getActivity()).getSupportActionBar().show();
        //show title
        ((MainActivity) getActivity()).getSupportActionBar().setTitle(R.string.app_name);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    public void inputFilter() {
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                contactsAdapter.filterList(newText);
                return true;
            }
        });
    }

    @Override
    //Fab button listener
    public void onClick(View v) {
        ((MainActivity) getActivity()).showFragment(new NewContactFragment(), TAG);
    }

碎片通常只應與其直接父活動進行通信。 片段通過其父活動進行通信,允許活動管理來自該片段的數據的輸入和輸出,以與其他片段或活動協調。 將Activity視為控制器,管理與其中包含的每個片段的所有交互。

對此的一些例外是從另一個片段或嵌套子片段中呈現的對話 片段 這兩種情況都是這樣的情況:片段具有嵌套的子片段,因此允許它們向上傳遞給它們的父節點(這是一個片段)。

要記住的重要一點是, 碎片不應該直接相互通信,通常只應與其父活動進行通信 片段應該是模塊化,獨立和可重用的組件。 在大多數情況下,片段允許其父活動響應意圖和回調。

片段和活動可以通過三種方式進行通信:

  • Bundle - Activity可以構造一個片段並設置參數
  • 方法 - Activity可以調用片段實例上的方法
  • 偵聽器 - Fragment可以通過接口觸發活動上的偵聽器事件

換句話說,溝通通常應遵循以下原則:

閱讀有關Fragment及其在創建和使用碎片的通信的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM