从android片段访问MyApplication

时间:2013-06-10 14:06:46

标签: android fragment

基本上我开始将一个纯粹的活动应用程序移植到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];
    }

    ...
    ...
    ...
}

从活动中访问此操作我会执行类似

的操作
((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() ));
    }
}

ANSWER

最后我发现我忘记在清单文件中定义我的应用程序名称了!

现在我的代码按原样运行。

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

感谢您的帮助,了解onActivityCreated的内容很重要。

2 个答案:

答案 0 :(得分:6)

好的,这就是我的所作所为:

自定义应用

public class MyApplication extends Application {

    public int getColorCount() {
        return 1;
    }
}

自定义活动

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();
    }
}

自定义片段

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” 现在我不知道你是否可以像这个例子一样编码并在你自己的代码中找到问题,这当然会很棒。 如果不是那么我想我们需要的是从您的应用中逐步了解更多详情,您的片段实现,日志输出等。

备注

概述了上述实现,以便在完全创建托管活动时检索托管活动。这可能因应用程序而异:

  • 如果您只想以对象身份访问自己的活动,请使用onAttach回调
  • 如果要访问完全创建的活动,请使用onActivityCreated回调

这是两个不同的用例,您应该始终了解您的需求

答案 1 :(得分:1)

Android: Fragment cannot get activity

基本上,您可能会尝试在Activity生命周期的错误点访问Fragment。确保您只在Activity期间或之后尝试访问onActivityCreated。 (我说可能是因为没有代码就无法分辨。如果不是问题,请显示更多Fragment代码。)