gpt4 book ai didi

android - 从 android fragment 访问 MyApplication

转载 作者:行者123 更新时间:2023-11-29 14:39:16 26 4
gpt4 key购买 nike

基本上,我开始将纯 Activities 应用程序移植到 Fragments,但我几乎停留在第一步。

在我当前的应用程序中,我扩展应用程序以访问用于自定义应用程序的全局常量和变量。

public class MyApplication extends Application {
private final int nbreLivres = 50;
private final String[] nomsLivres = new String[nbreLivres];

private final int colorCount = 25;
private final int[] customColors = new int[colorCount];

private SparseIntArray hmColors = new SparseIntArray();

private int mCustomFontSize = 14;

private static MyApplication instance;

...
...

public int getColorCount() {
return colorCount;
}

public int getColorFromIndex(int index) {
return customColors[index];
}

...
...
...
}

从我做类似的 Activity 中访问它

((MyApplication) this.getApplication()).getColorCount();

如果我需要用我做的实例访问它

private MyApplication mApp = MyApplication.getMyApplication();
mApp.getColorCount();

问题:

在 Fragment 中执行这些操作时,例如设置列表 (ListFragment) 的值以列出我的应用程序中可用的所有颜色

((MyApplication) getActivity().getApplication()).getColorsList();

我也试过了

MyApplication.getMyApplication().getColorsList();

两者都在该行崩溃并出现“空指针”异常。

我有什么不明白或者我做错了什么?

编辑

抱歉,我忘了说它是基于 Eclipse 中给出的主/详细示例,我在其中尝试用我自己的数据填充主列表。

就在这里(我没有复制/粘贴所有无用的东西)。

public class LivreListFragment extends ListFragment {

...
...

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1, ((MyApplication) getActivity().getApplication()).getColorsList() ));
}
}

回答

最后我只是发现我忘了在我的 list 文件中定义我的应用程序名称!

现在我的代码可以正常工作了。

但是根据@CharlieCollins 的回答,我必须把它放在 onActivityCreated 而不是 onCreate 中(不安全)。

谢谢你的帮助,了解到 onActivityCreated 的事情很重要。

最佳答案

好的,这就是我所做的:

自定义应用

public class MyApplication extends Application {

public int getColorCount() {
return 1;
}
}

自定义 Activity

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

getFragmentManager().beginTransaction().add(R.id.container, new TestFragment()).commit();
}
}

自定义 fragment

public class TestFragment extends Fragment {

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

int test = ((MyApplication) getActivity().getApplication()).getColorCount();
Log.d("testfrag", "" + test);
}
}

它如预期的那样打印出“1”。
现在我不知道您是否可以只在这个示例旁边编写代码并自己找到代码中的问题,这当然很棒。 如果不是,那么我想我们在这里需要的是逐步从您的应用、您的 fragment 实现、日志输出等中获取更多详细信息。

备注

上面的实现被概述为在完全创建后检索托管 Activity 。这可能因应用程序而异:

  • 如果您只是想将 Activity 作为对象访问,请使用 onAttach 回调
  • 如果您想访问一个完全创建的 Activity ,请使用 onActivityCreated 回调

这是两个不同的用例,您应该始终清楚自己需要什么

关于android - 从 android fragment 访问 MyApplication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17025811/

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