从android片段访问MyApplication

HpT*_*erm 1 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];
    }

    ...
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

从活动中访问这些我做的事情

((MyApplication) this.getApplication()).getColorCount();
Run Code Online (Sandbox Code Playgroud)

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

private MyApplication mApp = MyApplication.getMyApplication();
mApp.getColorCount();
Run Code Online (Sandbox Code Playgroud)

题 :

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

((MyApplication) getActivity().getApplication()).getColorsList();
Run Code Online (Sandbox Code Playgroud)

我也试过了

MyApplication.getMyApplication().getColorsList();
Run Code Online (Sandbox Code Playgroud)

两者都只是在该行崩溃时出现"空指针"异常.

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

编辑

对不起,我忘了提到它是基于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() ));
    }
}
Run Code Online (Sandbox Code Playgroud)

回答

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

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

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

谢谢你的帮助,了解onActivityCreated的东西很重要.

ava*_*cha 6

好的,这就是我做的:

定制应用

public class MyApplication extends Application {

    public int getColorCount() {
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

自定义活动

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

自定义片段

public class TestFragment extends Fragment {

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

        int test = ((MyApplication) getActivity().getApplication()).getColorCount();
        Log.d("testfrag", "" + test);
    }
}
Run Code Online (Sandbox Code Playgroud)

它按照预期打印出"1".
现在我不知道你是否可以像这个例子一样编码并在你自己的代码中找到问题,这当然会很棒.如果没有,那么我想我们需要的是从你的应用程序,你的片段实现,日志输出等逐步更多的细节.

备注

概述了上述实现以在完全创建主机活动时检索主机活动.这可能因应用程序而异:

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

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