0

我正在尝试在同一活动中单击另一个片段的按钮时更改片段的文本视图中的文本。

onCreateView 在类的顶部返回

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.deckbuilder_fragment, container,
            false);

    return view;
}

我在 onCreateView 和 onStart 之间的任何方法之外声明了 TextView

TextView deckSize;

相同的代码在 onCreateView 和 deckSize() 之间的 onStart 方法中工作正常。

public void onStart() {
    super.onStart();
deckSize = (TextView) getView().findViewById(R.id.decksize);
    final SharedPreferences defaultDeck = getActivity()
            .getSharedPreferences("defaultDeck", Context.MODE_PRIVATE);
    deckSize.setText(String.valueOf(defaultDeck.getInt("decksize", 0)));

}

但是空指针发生在第 180 行

public void deckSize() {
    deckSize = (TextView) getView().findViewById(R.id.decksize);  //line 180
    final SharedPreferences defaultDeck = getActivity()
            .getSharedPreferences("defaultDeck", Context.MODE_PRIVATE);
    deckSize.setText(String.valueOf(defaultDeck.getInt("decksize", 0)));
}

这是编码到 TextView 所在片段中的方法。我在该片段的 XML 布局文件中构建了 TextView。奇怪的是,这个方法内部的确切代码也在类树中同一片段的 onStart 方法中,并且工作正常。我在 onStart 方法之前的类中进一步声明了 TextView deckSize。这是相关的 logcat 文本。

FATAL EXCEPTION: main
java.lang.NullPointerException
at com.maliciousgames.deckbuilder.DeckBuilderFragment.deckSize(DeckBuilderFragment.java:180)
at com.maliciousgames.deckbuilder.DeckBuilder.deckSize(DeckBuilder.java:35)
at com.maliciousgames.deckbuilder.BlockCardBrowserFragment$2.onClick(BlockCardBrowserFragment.java:105)
at android.view.View.performClick(View.java:4240)
at android.view.View$PerformClick.run(View.java:17721)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

180号线就是这条线

deckSize = (TextView) getView().findViewById(R.id.decksize);

我正在从父活动中的方法调用此 deckSize 方法

public void deckSize() {

    DeckBuilderFragment deckBuilderFragment = new DeckBuilderFragment();
    deckBuilderFragment.deckSize();
}

我正在从另一个片段调用父活动中的该方法,该片段位于同一个父活动中,就像这样

((DeckBuilder) getActivity()).deckSize();

我对 Android 和 Java 还很陌生,非常感谢任何人提供的任何帮助或指导。

4

2 回答 2

1

你在打电话

deckBuilderFragment.deckSize();

紧接着

 DeckBuilderFragment deckBuilderFragment = new DeckBuilderFragment();

所以onCreateView()还没有被调用,因此你从来没有夸大你的视图,所以当你调用时 deckBuilderFragment.deckSize(); getView()返回null

于 2013-10-03T00:31:48.850 回答
0

好的,我能够通过关于 SO 的措辞不同的问题获得帮助。Emmanuel 能够为我指明正确的方向。我正在回答这个问题,以帮助其他可能遇到类似情况的人。

要将文本附加到第一个片段中的文本视图,您只需通过主(或父)活动中的公共方法执行此操作,然后从第二个片段调用它。

于 2013-10-03T13:40:34.317 回答