【问题标题】:How to update a background fragment when resumes?恢复时如何更新背景片段?
【发布时间】:2012-12-11 12:14:03
【问题描述】:

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);
}
}

当我单击“返回”按钮时,从 fragmentB 中,我只是从返回堆栈中删除了这个片段。结果 FragmentB 恢复了。但是 edittext 值没有更新为新值。

当 FragmentA 恢复时,我应该怎么做才能更新它的某些视图。请帮忙。

【问题讨论】:

标签: android android-fragments


【解决方案1】:

因此,如果我理解正确,您希望在单击片段 B 中的按钮后更新片段 A。如果是这种情况,我有一个解决方案,但它不是很优雅,但它可以工作。我在片段 B 中调用了片段 A 的 OnPause。

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

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

【讨论】:

  • 虽然这是一种简单的方式,但也有一些很好的消息传递方式,例如broadcast receiver
  • 在片段之间传递变量并不是那么简单。理论上也可以使用 .putArguments(...) .getArguments(...),但在这种情况下有点复杂。
  • 您能否举例说明如何实现这一目标?我也非常感谢使用不同的方法。
  • @Max 我认为这不会有帮助,因为如果您在离开 FragmentA 之前拥有新值,它将起作用。如果你想在 FragmentB 中设置用户给的值,那么它会失败。我的意思是你的代码完全是静态的,但不是动态的。
  • @Max 感谢您的想法。我暂时用这个。
【解决方案2】:

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

fragmentA 开始FragmentB 时,它将调用onPause()FragmentA,我已将标志设置为true。当从FragmentTransaction 中删除FragmentB 时,它将调用FragmentAonResume(),我在其中检查标志值并更新FragmentA

我认为这是一个更好的解决方案,而不是显式调用生命周期方法onPause()

【讨论】:

  • 请注意,当按下返回按钮时,OnResume 不会在片段 A 中调用。如果我按照以下方式删除片段 B,则不会在片段 A 中调用 OnResume Fragment fragmentb = getActivity().getSupportFragmentManager().findFragmentByTag("fragmentb"); getActivity().getSupportFragmentManager().beginTransaction().remove(fragmentb).commit();
  • 但这仍然是一种有趣的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2019-01-16
  • 2011-07-02
相关资源
最近更新 更多