1

基本上我开始将一个纯粹的活动应用程序移植到片段,我几乎被困在第一步。

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

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

问题 :

在片段中执行这些操作时,例如设置列表 (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() ));
    }
}

回答

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

现在我的代码按原样工作。

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

感谢您的帮助,了解 onActivityCreated 的重要性。

4

2 回答 2

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回调

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

于 2013-06-10T21:41:27.573 回答
1

Android:片段无法获得活动

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

于 2013-06-10T14:32:49.927 回答