恢复时如何更新背景片段?

时间:2012-12-11 12:14:04

标签: android android-fragments

MainActivity.java

FragmentA fragmentA = null;
FragmentB fragmentB = null;

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

}

public void replaceFragment(Fragment newFragment){
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.right_container, newFragment);
    ft.addToBackStack(null);
    ft.commit();
}

public void removeFromActivity(Fragment oldFrag){
    FragmentManager manager = getFragmentManager();
    FragmentTransaction ft = manager.beginTransaction();
    manager.popBackStack();
    manager.executePendingTransactions();
    ft.remove(oldFrag);
    ft.commit();
}

FragmentA.java

public class FragmentA extends Fragment implements OnClickListener{

public View contentView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    if(null == contentView){
        contentView = inflater.inflate(R.layout.fragment_a, null);
        EditText editTxt = (EditText) contentView.findViewById(R.id.right_frag_edit_txt);
        editTxt.setOnClickListener(this);
    }
     //--------------------------------------------------//
     //Here If I am printing
     EditText editTxt = (EditText) contentView.findViewById(R.id.right_frag_edit_txt);
     System.out.println(editTxt.getText()); //Output -- Now Button has Clicked --New value as expected
    return contentView;
}

public void setValues(String newVal){
    EditText editTxt = (EditText) contentView.findViewById(R.id.right_frag_edit_txt);
    editTxt.setText(newVal);
}

@Override
public void onClick(View v) {
    FragmentB newFrag = new FragmentB();
    ((MainActivity)getActivity()).fragmentB = newFrag;
    ((MainActivity)getActivity()).replaceFragment(newFrag);
}
}

FragmentB.java

public class ReplacedFragment extends Fragment implements OnItemClickListener{

public View contentView;

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    if(null == contentView){
        contentView = inflater.inflate(R.layout.fragment_b, null);
    }
    return contentView;
}

@Override
public void onClick(View v) {
    FragmentA previousFrag = ((MainActivity)getActivity()).fragmentA;
    previousFrag.setValues("Now Button has Clicked");
    ((MainActivity)getActivity()).removeFromActivity(this);
}
}

当我点击按钮“Back”时,从fragmentB,我只是从后面的堆栈中删除这个片段。结果,FragmentB恢复了。但edittext值未使用新值进行更新。

如果要恢复FragmentA的某些视图,我该怎么办?请帮忙。

2 个答案:

答案 0 :(得分:1)

因此,如果我正确理解了这一点,那么一旦你点击片段B中的一个按钮就想更新片段A.如果是这种情况我有一个解决方案,但它不是很优雅,但它有效。我在片段B中调用片段A的OnPause。

Fragment fragmentA = getActivity().getSupportFragmentManager().findFragmentByTag("fragmentA");
fragmentA.onPause();

在OnPause中,您现在可以以编程方式更新片段A.理论上您也可以调用OnResume,但在我的情况下,我已经将OnResume用于其预期目的。

答案 1 :(得分:1)

最后我找到了一个解决方案,但我不知道它是否是一个有效的解决方案。但我仍在分享它。

FragmentB开始fragmentA时,它会调用onPause() FragmentA,我已将标志设置为true。从FragmentB移除FragmentTransaction后,它会调用onResume()的{​​{1}}我正在检查标记值并更新FragmentA

我认为这是一个更好的解决方案,而不是明确调用生命周期方法FragmentA