Fragment-等待onCreateView()完成后再运行方法



我正在处理一系列与Fragment有关的令人费解的事件。我正在尝试向Activity添加一个片段,然后在片段中调用一个方法来更新一些文本。然而,我发现在onCreateView()完成之前,该方法正在片段中进行处理,这给我留下了一个空的View对象,我的方法失败了。这是Activity代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_log_entry_details);
    fragmentManager = getSupportFragmentManager();
    titleBarFragment = new TitleBarVerticalFragment();
    fragmentTransaction = fragmentManager.beginTransaction ();
    fragmentTransaction.add(R.id.log_entry_title_frame, titleBarFragment);
    fragmentTransaction.commit();
    titleBarFragment.updateTitleBar("Edit Log Entry", 20, false);
}

看起来很简单。这是TitleBarVerticalFragment类:

public class TitleBarVerticalFragment extends TitleBarFragment {
    @Inject SharedVisualElements sharedVisualElements;
    View view;
    TextView titleLabel;
    public TitleBarVerticalFragment() {
        // add this line for any class that want to use any of the singleton objects
        Injector.INSTANCE.getAppComponent().inject(this);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        Log.d(Constants.TAG, "title fragment onCreateView()");
        view = inflater.inflate(R.layout.fragment_title_bar_vertical, container, false);
        ImageView logoImage = (ImageView) view.findViewById(R.id.logo_vertical);
        titleLabel = (TextView) view.findViewById(R.id.verticalTitleLabel);
        titleLabel.setTextColor(sharedVisualElements.secondaryFontColor());
        titleLabel.setTypeface(sharedVisualElements.font());
        titleLabel.setTextSize(20);
        logoImage.setImageDrawable(sharedVisualElements.logoImage());
        logoImage.setBackgroundColor(Color.TRANSPARENT);
        return view;
    }
    public void updateTitleBar(String text, int textSize, boolean titleLabelIsHidden) {
        Log.d(Constants.TAG, "about to update title bar text");
        if (view == null) {
            Log.d(Constants.TAG, "vertical title fragment is null");
            return;
        }
        if (titleLabel == null)
            titleLabel = (TextView) view.findViewById(R.id.verticalTitleLabel);
        if (titleLabel == null) {
            Log.d(Constants.TAG, "vertical title label is null");
            return;
        }
        Log.d(Constants.TAG, "updating title text: " + text);
        titleLabel.setText(text);
        titleLabel.setTextSize(textSize);
    }

注意这个logcat输出的顺序。注意到onCreateView()似乎是如何在updateTitleBar()方法之后运行的吗?怎么可能呢?

即将更新标题栏文本
垂直标题片段为空
CreateView()上的标题片段

在调用片段的任何其他方法之前,如何确保onCreateView()运行?非常感谢。

尝试在fragmentTransaction.commit()之后运行fragmentManager.executeEndingTransactions();以及在titleBarFragment.updateTitleBar之前("编辑日志条目",20,false);

只需在活动上使用onStart()

定义一个监听器接口并在您的"活动"中实现它。

interface LyfecycleListener {
  void onCreatedView();
}

在您的活动中:

@Override
protected void onCreate(Bundle savedInstanceState) {
  ...
  this.titleBarFragment = new TitleBarVerticalFragment();
  this.titleBarFragment.setListener(this)
  ...
}
@Override
public void onCreatedView() {
  titleBarFragment.updateTitleBar("Edit Log Entry", 20, false);
}

在您的片段中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
  this.listener.onCreatedView();
}

最新更新