gpt4 book ai didi

android - 如何在 OnCreateView() 之外获取 Fragment 的 View

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:00 24 4
gpt4 key购买 nike

我有一个带有 TableLayoutFragment。表中的数据来自 SQLite 数据库。 SQLite 数据库是从 MainActivity 中的 AsyncTask 中的 RESTful web 服务填充的。 Fragment 必须等待任务完成才能填充表。 Fragment 监听要调用的任务 onPostExecute() 方法。如果是,则调用 Fragment 中的方法 onLoadAndStoreComplete()。这一切都有效。

我需要在 fragment 的 OnCreateView() 方法之外获取 TableLayout 的 View 。如果我可以在 onLoadAndStoreComplete 中获取 fragment 的 View ,那我就可以到达那里。

Same code as here.我从 MainActivity 获得了 mContext,但是没有与之关联的 getView() 方法。

我试过:
- 创建类成员 rootView 并在 onCreateView() 中分配,但在 onLoadAndStoreComplete() 中,它为 null。
- 创建类成员 tableLayout 并在 onCreateView() 中分配,但在 onLoadAndStoreComplete() 中,它为 null。
- 在 onLoadAndStoreComplete() 中再次调用 this.getView(),但它返回 null。
- 在 onLoadAndStoreComplete() 中调用充气机,这有效,但我不知道在 .inflate() 调用中为容器使用什么

不明白为什么onLoadAndStoreComplete()中rootView和tableLayout的类成员值为null

public class MyFragment extends Fragment implements OnLoadAndStoreCompleteListener {

private TableLayout tableLayout;
private View rootView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContext = this.getActivity();
rootView = inflater.inflate(R.layout.fragment_permits, container, false); // this works
tableLayout = (TableLayout) rootView.findViewById(R.id.main_table); // and this
...
}

@Override
public void onLoadAndStoreComplete() {

// rootView is null, ie not remembered from OnCreateView

View view = getView(); // null

LayoutInflater inflater = LayoutInflater.from(getActivity());
rootView = inflater.inflate(R.layout.fragment_permits, container, false); // container? don't know what it should be

// tableLayout is null
tableLayout.addView(tableRow, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
}
...
}

最佳答案

如果我对您的代码的理解正确,那么您的代码不遵守 Fragment 生命周期不同的 Fragment 实例失败有问题。

A.生命周期问题

Android 框架希望您的 Fragment 在 onCreateView() 方法中创建其 View 。在框架调用此方法后 View 变得可用。

可能是您的代码在 onCreateView() 之前调用了 onLoadAndStoreComplete(),这导致了问题。

您需要提取用数据填充实际 View 的方法,因为它可以有 2 个入口点。请看下面的代码:

public class MyFragment extends Fragment implements OnLoadAndStoreCompleteListener {
private TableLayout tableLayout;
private View rootView;
private SomeDataClass loadedData;

@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
mContext = this.getActivity();
rootView = inflater.inflate(R.layout.fragment_permits, container, false);
tableLayout = (TableLayout) rootView.findViewById(R.id.main_table);

updateUi(); // If onLoadAndStoreComplete() was already called
// this will plug newly created view to returned data
}

@Override
public void onLoadAndStoreComplete() {
loadedData = ...; // Save loaded data here
updateUi(); // If onCreateView() was already called
// this will plug loaded data to the view
}


private void updateUi() {
if (rootView == null) { // Check if view is already inflated
return;
}

if (loadedData != null) {
// View is already inflated and data is ready - update the view!
...
}
}
}

B.不同实例失败

当您在前面提到的 fragment 的 2 个不同实例上操作时,可能会发生这种情况。

首先,一切看起来都是有序的:onCreateView()onLoadAndStoreComplete() 之前调用。因此检查这些:

  • 记录/调试 Fragment 的默认构造函数调用。您希望在创建/加载流程期间对您的 fragment 进行一次调用。
  • 检查调用onCreateView()的对象是否与调用onLoadAndStoreComplete()的对象完全相同,您可以使用System.identityHashCode(this),在这两种方法中获取不同的值是一个不好的迹象

如果发生这种情况,原因可能隐藏得更深一些,没有代码我无法就此给您准确的建议。你如何创建你的 fragment ?通过 XML 或手动添加,然后通过 FragmentManager 或通过 ViewPager 添加?

关于android - 如何在 OnCreateView() 之外获取 Fragment 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29607864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com