背景与问题:

我有一个自定义的Fragment类。我将此片段类重用于多个状态显示。在父Activity中,我加载该片段并在该片段上调用一个方法以设置一些文本,等等。执行此操作时,我命中了NullPointerException。原因是尚未调用onCreateView(),即视图不存在,因此访问TextView调用.setText(String)当然会遇到NullPointerException

片段类

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.example.app.R;

public class CopyStaticFragment extends Fragment {

    private String initialActionText, initialSecondaryText, initialTitleText;
    private TextView textViewTitle, textViewSecondary;
    private Button btnAction;
    private View.OnClickListener actionCallback;

    public void setActionButtonListener(View.OnClickListener actionCallback) {
        this.actionCallback = actionCallback;
    }

    public CopyStaticFragment() {
    }

    public CopyStaticFragment(View.OnClickListener actionCallback) {
        this.actionCallback = actionCallback;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View layout = inflater.inflate(R.layout.fragment_main_status, container, false);

        textViewTitle = layout.findViewById(R.id.textViewTitle);
        textViewTitle.setText(initialTitleText);
        textViewSecondary = layout.findViewById(R.id.textViewSecondary);
        textViewSecondary.setText(initialSecondaryText);
        btnAction = layout.findViewById(R.id.btnAction);
        btnAction.setText(initialActionText);
        btnAction.setOnClickListener(v -> {
            if(actionCallback != null) {
                actionCallback.onClick(v);
            }
        });

        return layout;
    }

    public void setPrimaryText(String text) {
        textViewTitle.setText(text);
    }

    public void setSecondaryText(String text) {
        textViewSecondary.setText(text);
    }

    public void setActionText(String text) {
        btnAction.setText(text);
    }

    public void setInitialActionText(String text) {
        this.initialActionText = text;
    }

    public void setInitialSecondaryText(String text) {
        this.initialSecondaryText = text;
    }

    public void setInitialTitleText(String text) {
        this.initialTitleText = text;
    }

}


在我的主要活动的某处,作为来自Service状态的回调响应,我将执行以下操作:

if (instance.getUnbackedUpCount() > 0) {
    // Load first fragment - i.e. we can backup content
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.frameCurrentStatus, copyStartFragment)
            .commit();
    capacityControlFragment.setInfoIconVisible(true);
} else {
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.frameCurrentStatus, copyFinishFragment)
            .commit();
}


其中copyStartFragmentcopyFinishFragment是上述片段的实例。

注意:

根据Service状态更新间隔,对replace()片段的调用几乎是瞬时的-我认为这是实际问题。

我的解决方法:

将具有所有视图及其属性的初始设置器。例如initialTitleTextinitialMessageTextinitialActionButtonTextinitialActionButtonVisibility等。我觉得这有点怪异,不符合Fragment使用的预期设计理念。

我的问题

我这是遇到这样的错误的设计问题,还是有一种变通方法来及早调用onCreateView()

最佳答案

您正在使用.commit()作为替换片段的一部分。
这是异步完成的。没有办法解决,这只是该功能的工作原理。

您可以使用.commitNow(),它将完成同步。
这样,您应该能够在函数返回后立即访问视图。

https://developer.android.com/reference/androidx/fragment/app/FragmentTransaction#commitNow()

关于java - Android fragment onCreateView延迟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59447586/

10-12 04:04