我非常好奇如何确定(来自外部类)是否已经调用了片段onCreateView()
。我搜索过类似的问题,但没有找到。
例如,fragment.isAdded()
是一个很好的指标吗?
我的第一个想法只是fragment.getView() != null
,但我并非100%确定它看起来是可靠的,而且我也有点不愿意使用它(没有特别的原因,我只是倾向于避免无效检查)。我很乐意找到一个解决方法。我的建议:
isAdded()
如果片段当前已添加到其活动中,则返回true。
我认为这条线很模糊; 添加不是附加,但已创建。它可能会引用FragmentTransaction.add()
(这在语义上是错误的,因为您可以在布局中卡住<fragment>
而无需致电add
或replace
。)
尽管如此,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()
。但是:
getView != null
有什么不同或更好。答案 0 :(得分:5)
Fragment.isAdded()是否暗示已调用onCreateView?
否强> !! 否强> !! 暂停 NOOOOOOO00000000000 !!!!!
SIR
Fragment.isAdded()
是一封通知,表明您的Fragment
已添加到Activity
,故事结尾。
add()
中的FragmentTransaction
方法有3种不同的方法,都将Fragment
添加到Activity
,另外两种方法可以创建Fragment
s View
并Parent
ViewGroup
依据LayoutInflater
将其附加到(id != 0)
,前提是您的第一个参数不是 0 onCreateView()
要检查是否已调用onViewCreated()
,您需要覆盖getView()
。
onCreateView()
完成,否则 Fragment.isVisible()
将始终返回null
您的解决方案是{{1}}
仅供参考:我在文档中看到的并没有错。非常明确的先生。
希望我清醒先生
答案 1 :(得分:4)
假设
Fragment
是否可见onCreateView(...)
方法然后使用
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)