首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将碎片状态/数据从碎片保存到碎片

将碎片状态/数据从碎片保存到碎片
EN

Stack Overflow用户
提问于 2015-07-03 01:15:24
回答 2查看 128关注 0票数 0

如果用户离开片段并返回,我正在设法将用户输入的数据保存在片段上。我有一个活动是由几个片段组成的。我发现的所有示例都是在离开片段和活动时保存状态。我永远不会离开活动;因此,片段中的onSaveInstanceState永远不会被调用。onPause被调用,但是我想不出如何在那里保存状态。

这个应用程序显示了一张门票列表。当用户点击票证时,它会从本地DB获取只读字段的初步信息,并允许用户在提交之前输入票证信息。我试图让用户点击一张票,输入数据,离开并返回到该票证,而不会丢失输入的信息。

在我研究过的所有示例中,在我看来,我可以使用Fragmenttransaction保存片段的ID。

代码语言:javascript
复制
public class Activity_Main extends Activity 
implements  Fragment_OpenTickets.INT_OnOpenTicketSelectedListener,
            Fragment_SubTickets.INT_OnSubTicketSelectedListener,
            Fragment_Ticket.INT_SubmitNewTicket {
DBController dbc;
Fragment fr;
boolean gps_enabled = false;
boolean network_enabled = false;
HashMap<String, String> addInfo;
RadioButton btn_radio_open;
RadioButton btn_radio_submitted;
RadioButton btn_radio_settings;
String ticketDate, ticketTime;
int m, d, y, hr, min;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn_radio_open = (RadioButton)findViewById(R.id.radio_open);
    btn_radio_submitted = (RadioButton)findViewById(R.id.radio_submitted);
    btn_radio_settings = (RadioButton)findViewById(R.id.radio_settings);
    dbc = new DBController(this);
    if (dbc.checkCredentials() != null) {
        fr = new Fragment_OpenTickets();
    } else {
        fr = new Fragment_Settings();
        btn_radio_open.setChecked(false);
        btn_radio_submitted.setChecked(false);
        btn_radio_settings.setChecked(true);
    }
    FragmentManager fm = getFragmentManager();
    final FragmentTransaction ft = fm.beginTransaction();
    ft.add(R.id.fragment_place, fr);
    ft.addToBackStack(null); // For back button action.
    ft.commit();

    // Start scheduler service.
    this.startService(new Intent(this, Service_Send.class));
    // Start GPS service.
    startGPS();
}

/**
 * Top menu buttons.
 */
public void selectFrag(View view) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    switch (view.getId()) {
        case R.id.radio_open:
            //fr = new Fragment_OpenTickets();
            ft.replace(R.id.fragment_place, new Fragment_OpenTickets());
            ft.addToBackStack(null);
            btn_radio_submitted.setChecked(false);
            btn_radio_settings.setChecked(false);
            ft.commit();
            break;
        case R.id.radio_submitted:
            //fr = new Fragment_SubTickets();
            ft.replace(R.id.fragment_place, new Fragment_SubTickets());
            ft.addToBackStack(null);
            btn_radio_open.setChecked(false);
            btn_radio_settings.setChecked(false);
            ft.commit();
            break;
        case R.id.radio_settings:
            //fr = new Fragment_Settings();
            ft.replace(R.id.fragment_place, new Fragment_Settings());
            ft.addToBackStack(null);
            btn_radio_open.setChecked(false);
            btn_radio_submitted.setChecked(false);
            ft.commit();
            break;
    }
}

/**
 * Open ticket selection action.
 */
public void onOpenTicketSelected(HashMap position) {
    // Create fragment and give it an argument for the selected ticket.
    fr = new Fragment_Ticket();
    Bundle args = new Bundle();
    args.putSerializable("HashMap", position);
    fr.setArguments(args);

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.add(R.id.fragment_place, fr);
    ft.addToBackStack(null); // For back button action.
    ft.commit();
}

/**
 * Submitted ticket selection action.
 */
public void onSubTicketSelected(HashMap position) {
    // Create fragment and give it an argument for the selected ticket.
    fr = new Fragment_SubTicket();
    Bundle args = new Bundle();
    args.putSerializable("HashMap", position);
    fr.setArguments(args);

    FragmentManager fm = getFragmentManager();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction.replace(R.id.fragment_place, fr);
    fragmentTransaction.addToBackStack(null); // For back button action.
    fragmentTransaction.commit();
}

任何帮助都将不胜感激。如果我需要张贴更多的代码,那么请告诉我。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-03 02:06:34

我认为当用户离开片段时,您应该将票证信息存储在您的活动中,并在您返回时将其返回并显示出来。

在Activity_Main类中,创建两个方法:

代码语言:javascript
复制
public void saveTicketInfo(TicketInfo info) {
    // save info here
}

和:

代码语言:javascript
复制
public TicketInfo getTicketInfo() {
    // get info here
}

在你的片段中:

代码语言:javascript
复制
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    ...
    // get ticket info and display it
    Activity_Main mainActivity = (Activity_Main)getActivity();
    TicketInfo info = mainActivity.getTicketInfo();
    if (info != null) {
        // handle display info here
    }
    ...
}

@Override
public void onDestroyView() {
    TicketInfo info = new TicketInfo();
    // get info from view and store in the object
    Activity_Main mainActivity = (Activity_Main)getActivity();
    mainActivity.saveTicketInfo(info)
    super.onDestroyView();
}
票数 0
EN

Stack Overflow用户

发布于 2015-07-03 07:22:58

我在SO @ Passing data between fragments contained in an activity上发布了一个详细的答案。在上面找我的答案。这是一种将数据从片段传递到活动的安全方法。然后,您可以轻松地将该数据从活动传递到片段的构造函数或公共方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31197059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档