android片段状态仅在后退按钮上恢复,而不是当我从listview中随机选择片段时

时间:2014-03-18 01:53:29

标签: android android-fragments android-listview

您好我有一个listview侧边栏,我根据列表视图中的用户选择显示片段。

这就是我替换片段的方式

public void switchFragment(Fragment fragment, boolean addBackStack) {
        try {
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction ft = manager.beginTransaction();

            ft.replace(R.id.content, fragment);
            currentFragment = fragment;
           //if (addBackStack)
                ft.addToBackStack(null);
            ft.commit();
        } catch (Exception e) {

        }
    }

这是我的示例片段代码。现在当我替换片段时,我在onpause中保存实例状态并在onresume中恢复它,但它只有在按下后退按钮时才有效。当我从listview手动导航回片段时,片段状态不会恢复。为什么?

public class Fragment1 extends BaseFragment {   

    int currentFragmentInd = 1;  

    private Button startButton;
    private  Button endButton;
    private long savedStartTime;
    private TextView setStartText;
    private TextView setEndText;
    private String starttime;
    private String endtime;

    public int getIndex() {
        MyApplication.getApplication().setCurrentChild(0);
        MyApplication.getApplication().setCurrentGroup(0);
        return currentFragmentInd;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState !=null)
        {      



        }
    }

    @Override
    public void onResume() {
        super.onResume();
        setStartText= (TextView)getActivity().findViewById(R.id.MAtextView2);
        setEndText= (TextView)getActivity().findViewById(R.id.MAtextView3);
        setEndText.setText(endtime);
        setStartText.setText(starttime);
    }

    @Override
    public void onPause() {
        super.onPause();
        setStartText= (TextView)getActivity().findViewById(R.id.MAtextView2);
        setEndText= (TextView)getActivity().findViewById(R.id.MAtextView3);
        starttime=setStartText.getText().toString();
        endtime=setEndText.getText().toString();

    }

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


    }

    FrameLayout frameLayout;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View contentView = inflater.inflate(R.layout.layout1, null, false);

        ((MainActivity) getActivity()).openList(0, 0);




        if (savedInstanceState == null) {

        }





        startButton= (Button) contentView.findViewById(R.id.button);
        endButton= (Button) contentView.findViewById(R.id.button2);
        endButton.setEnabled(false);

        setStartText= (TextView)contentView.findViewById(R.id.MAtextView2);
        setEndText= (TextView)contentView.findViewById(R.id.MAtextView3);





        startButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {


                    Time now = new Time();
                    now.setToNow();




            }
        });



        endButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                    Time now = new Time();
                    now.setToNow();

                    setEndText.setText(now.hour+" : "+now.minute);


            }
        });


        return contentView;
    }




}

1 个答案:

答案 0 :(得分:0)

延迟重播但可能会帮助其他人。 发生这种情况是因为当您单击listview项时,您会创建该片段的新内容。 “我假设您发送给switchFragment(片段片段)的片段是使用'new'关键字创建的。” 因此,片段的这个新实例不会保留您的旧数据。

这就是我解决这个问题的方法。可能有更好的方法,但由于没有人回复,我会给出我的解决方案。

  1. 当您替换片段(ft.replace,fragment)时,请提供该事务的字符串引用:-ft.replace(R.id.content,fragment,“FRAGMENT_NAME”);
  2. 使用addToBackStack(null)将片段添加到backstack时;将你的片段名称放在null:-ft.addToBackStack(“FRAGMENT_NAME”);
  3. 创建一个方法,告诉您该片段是否已经创建,因此存在于后栈中。:

    public boolean isTagInBackStack(String tag){

        Log.i(TAG, "isTagInBackStack() Start");
        int x;
        boolean toReturn = false;
        int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
        Log.i(TAG, "backStackCount = " + backStackCount);
    
        for (x = 0; x < backStackCount; x++){
            Log.i(TAG, "Iter = " + x +" "+ getSupportFragmentManager().getBackStackEntryAt(x).getName());
            if (tag == getSupportFragmentManager().getBackStackEntryAt(x).getName()){
                toReturn = true;
    
            }
    
        }
    
        Log.i(TAG, "isTagInBackStack() End, toReturn = " + toReturn);
        return toReturn;
    }
    
  4. 现在,在创建该片段的新实例之前,如果存在名为“FRAGMENT_NAME”的backstack项,则在backstack中检查。 如果存在,请使用该项(片段)而不是创建新项。

    if (isTagInBackStack("FRAGMENT_NAME")){
        Log.i(TAG, "Tag is in BackStack!!!! frag is = " + getSupportFragmentManager().findFragmentByTag("FRAGMENT_NAME"));
    
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.main_activity_container, getSupportFragmentManager().findFragmentByTag("FRAGMENT_NAME"));
        transaction.addToBackStack("FRAGMENT_NAME");
        transaction.commit();
    }else{
        Create the fragment (this happens the first time. 
    }