我怎么知道onCreateView是从外部类调用的?

时间:2015-09-18 17:56:45

标签: android android-fragments android-activity android-lifecycle

我非常好奇如何确定(来自外部类)是否已经调用了片段onCreateView()。我搜索过类似的问题,但没有找到。

例如,fragment.isAdded()是一个很好的指标吗?

我的第一个想法只是fragment.getView() != null,但我并非100%确定它看起来是可靠的,而且我也有点不愿意使用它(没有特别的原因,我只是倾向于避免无效检查)。我很乐意找到一个解决方法。我的建议:

isAdded()

  

如果片段当前已添加到其活动中,则返回true。

我认为这条线很模糊; 添加不是附加,但已创建。它可能会引用FragmentTransaction.add()(这在语义上是错误的,因为您可以在布局中卡住<fragment>而无需致电addreplace。)

尽管如此,FragmentTransaction.add() documentation没有提供任何信息,也没有让您想到added -> created。我不说。

ISVISIBLE()

  

如果片段当前对用户可见,则返回true。这意味着:(1)已添加,(2)其视图附加到窗口,(3)未隐藏。

isVisible() -> isCreated的意义上看起来不错,但第三个选项使其成为isCreated != isVisible。我只想到一个视图分页器中的片段:并非所有片段都可见,但是当前可见片段附近的片段被添加,创建和存活,您可以调用它们上的方法。但对他们来说,isVisible() == false。这太严格了。

isInLayout()

  

如果布局包含在活动视图中,则返回true   通过&lt;层次结构片断&gt;标签。这总是如此   片段是通过&lt;片断&gt;标签,除了案件   旧片段从先前状态恢复的位置确实如此   没有出现在当前状态的布局中。

我不认为这适用于此。

getView()!= null

  

返回   片段的根视图,如果没有布局,则为null。

这仍然是唯一的解决方案。我只是想确认一下。

实施回调

..被称为onCreateView()或更好,onViewCreated()。但是:

  • 我不需要在创建片段后立即调用某些内容(为什么需要它?),我需要在给定时间检查某些内容;
  • 应该定义相反的,例如onViewNotAvailableAnymore(),以使检查始终有意义;
  • 我不知道这与getView != null有什么不同或更好。

8 个答案:

答案 0 :(得分:5)

  

Fragment.isAdded()是否暗示已调用onCreateView?

!! !! 暂停 NOOOOOOO00000000000 !!!!!

SIR

Fragment.isAdded()是一封通知,表明您的Fragment已添加到Activity,故事结尾。

add()中的FragmentTransaction方法有3种不同的方法,都将Fragment添加到Activity,另外两种方法可以创建Fragment s ViewParent ViewGroup依据LayoutInflater将其附加到(id != 0),前提是您的第一个参数不是 0 onCreateView()

要检查是否已调用onViewCreated(),您需要覆盖getView()

除非onCreateView()完成,否则

Fragment.isVisible()将始终返回null

您的解决方案是{{1}}

仅供参考:我在文档中看到的并没有错。非常明确的先生。

希望我清醒先生

答案 1 :(得分:4)

假设

  • 您对Fragment是否可见
  • 不感兴趣
  • 您只想知道Android框架是否已调用onCreateView(...)方法
  • 您需要使用现有的Fragment API方法来查找

然后使用

getView() != null

如果您夸大布局并返回View内的onCreateView(...)

非Fragment-API方法是在onCreate(...)中添加回调,然后在onCreateView()或更晚(生命周期)方法中调用该回调。

答案 2 :(得分:2)

可以使用界面完成。创建一个OnCreateViewListerner接口

public interface OnViewCreatedListener
    {
        void onCreateCalled();
    }

在Fragment中创建一个OnViewCreatedListener的静态对象,并在你的Outer类中初始化它,Outer类实现这个接口,如

    public class CustomClass implements OnViewCreatedListener{
        @Override
        public void onCreateCalled() {

        }
    public void  initializeInterface()
    {
        FragmentTest.listerner = this;
    }
    .....

    }

然后覆盖你的onCreateView()方法并写下这个

public class FragmentTest extends Fragment{

public static OnViewCreatedListener listerner;
    View mView;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//        if (container == null)

        if(listerner!= null)
        {
            listerner.onCreateCalled();
        }
        mView = inflater.inflate(R.layout.fragment_product, container, false);


        return mView;
    }


    }

希望这会对你有所帮助。

答案 3 :(得分:2)

请像我一样考虑这种方法:

在片段中定义Interface说:

public Interface IDoSomething{

  void intimateAfterOnCreateView();
}

现在,根据生命周期在片段的onStart()中调用此方法,此方法将在onCreateView()之后调用。 在这个片段之外只需实现IDoSomething,您将自动获得一个重写方法( intimateAfterOnCreateView() )。

现在,此方法的执行将显示已调用onCreateView()

我只是想分享我的知识,可能会有所帮助。

答案 4 :(得分:1)

如果片段上的isAdded()返回true,则表示已调用onCreateView()并不意味着。实际上,即使在onAttach回调期间,isAdded也会返回true,这是在onCreate()之前调用的。

答案 5 :(得分:0)

我会继续扩展Fragment类并添加一个可用于从自定义Fragment类外部到达的公共方法。

调用onCreateView()时,您可以将布尔值设置为 true ,根据您的体系结构,您可以将其设置为 false 。它位于onPause()onStop()onDestroyView()onDestroy()onDetach(),由您决定。

我不认为您在问题中提到的方法会为您提供您所需的确切内容。

答案 6 :(得分:0)

  

我怎么知道onCreateView是从外部类调用的?

您需要在片段中创建界面并在容器活动中实现它(让我们说MainActivity)。

<强> 1。首先在片段中创建一个界面:

public class MainActivity extends AppCompatActivity implements
        YourFragment.OnCreateViewCalledListener {
...

@Override
    public void OnCreateViewCalled(String someData) {
      Toast.makeText(MainActivity.this, "OnCreateView was called and passed " + someData)
    }

<强> 2。接下来在容器活动中实现接口(假设它是MainActivity)并调用它的方法:

//Using onAttach method to check that activity has implemented callbacks
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // Make sure that container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (OnCreateViewCalledListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnCreateViewCalledListener");
    }
}

第3。然后,您需要检查MainActivity是否实现了接口回调(此步骤对于使其正常工作至关重要):

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        mCallback.OnCreateViewCalled("Some useful data");
        ...
    }

<强> 4。最后,您需要在onCreateView中触发回调:

<Alloy>
    <Window id="mainWindow">
    </Window>
</Alloy>

那就是它!

修改

要让其他类知道onCreateView被调用,请使用MainActivity中的onCreateViewCalled()回调(例如,使用另一个接口来触发其他类中的回调)。 此外,不必将数据传递到OnCreateViewCalled()

答案 7 :(得分:-1)

  

Fragment.isAdded()是否暗示已调用onCreateView?

isAdded()如果片段当前已添加到其活动中,则返回true。 (隐含地onCreateView()被称为)。