使用在另一个片段(NPE)中生成的值设置片段的 TextView [重复]
Posted
技术标签:
【中文标题】使用在另一个片段(NPE)中生成的值设置片段的 TextView [重复]【英文标题】:Set TextView of a Fragment with value generated in another Fragment (NPE) [duplicate] 【发布时间】:2017-12-04 15:46:42 【问题描述】:我有一个 Activity QuestScreen,它在创建时包含 Fragment FragmentQuest。 如果我按下按钮,这会触发屏幕活动的 next() 方法,从而将 FragmentQuest 替换为 FragmentAction。 p>
到目前为止,替换工作正常。问题是,在替换之后,我想在 FragmentAction 中设置一个 TextView,以在 QuestScreen 活动。
我的第一次尝试是将 TextView 设置在 FragmentAction 的 onCreatView 之外。这会导致处理 TextView 的 Nullpointer 异常。
到目前为止,我看过:This、That、This 和 That
下面看到的尝试导致代码中标记了 NullpointerException。
在 QuestScreen 类中
private void next()
//The needed value for the TextView is stored in nextTransition
Transition nextTransition;
//Check if an entry is in the list
if(quest.getTransitionsAbleToFire().size() > 0)
nextTransition = quest.getTransitionsAbleToFire().get(0);
fragmentAction = (FragmentAction) fm.findFragmentByTag(TAG_FRAGMENT_ACTION);
// create the fragment and data the first time
if (fragmentAction == null)
Log.d("QuestScreen onCreate" , "create fAction for first time");
// add the fragment
fragmentAction = (FragmentAction) Fragment.instantiate(this, FragmentAction.class.getName(), null);
fm.beginTransaction().add(fragmentAction, TAG_FRAGMENT_ACTION).commit();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.flFragmentContainer, fragmentAction);
fragmentTransaction.commit();
//Triggers the corresponding activity in fragmentAction, to set the TextView to a value which is stored in nextTransition
fragmentAction.nextAction(nextTransition);
nextTransition.fire();
else
CharSequence text = "Quest END";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(getApplicationContext(), text, duration);
toast.show();
在 FragmentAction 类中
public class FragmentAction extends Fragment
private TextView txtYourQuest;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setRetainInstance(true);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
// CREATE VIEWS HERE
View layout = inflater.inflate(R.layout.content_action_fragment, container, false);
txtYourQuest = (TextView) layout.findViewById(R.id.txtV_Your_Quest);
return layout;
@Override
public void onActivityCreated(Bundle savedInstanceState)
super.onActivityCreated(savedInstanceState);
public void nextAction(Transition prmTransition)
// --> Here in the enxt Line comes the NPE : java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.app.Activity.findViewById(int)' on a null object reference
FrameLayout container = (FrameLayout) getActivity().findViewById(R.id.flFragmentContainer);
LayoutInflater.from(getActivity())
.inflate(R.layout.content_action_fragment, container, false);
txtYourQuest.setText("Your " + prmTransition.getAction().getPosition() + ". is to:\n "
+ prmTransition.getAction().getActionName());
【问题讨论】:
@Rotwang - OP 基本上询问如何将数据传递给 Fragment,并说以前的尝试导致了各种 NPE(毕竟应该证明自己的努力)。但是由于解决方案不是“进行空检查”,因此如果它完全是重复的,IMO 则不是最后一个链接所指的问题。请注意,这不是要重新打开,我发布了答案,因为评论太长了,我投票赞成,因为对于 SO 的新手来说,这是一个很好的问题。如果我做对了,好的复制品可能会通过指大海捞针来帮助其他人。 @0X0nosugarThe attempt seen below leads to an NullpointerException marked in the code.
被称为Yust Another NPE-Related Duplicate Question
。
@Rotwang - 好吧,所以如果这是我的问题,我应该在必要时添加空检查,然后问“为什么这段代码不起作用”?
@Rotwang - 感谢您信任我避免/处理 NPE ;-) 并感谢您的耐心等待。也许这就是重点:对我来说,这是一个关于 android 机制的问题,被一些 NPE 掩盖了。使用空检查,应用程序不会崩溃。但我想“不会崩溃”并不是“任务完成”。
抱歉重复,我不知道。玩了一下代码并创建了一个解决方法。而不是使用返回 null 的 getActivity 方法。 (我认为是因为 nextAction() 是在 onCreate、onCreateView、onAttach 等之前执行的。)我现在将提交的数据存储在本地对象中,并使用该对象在 之后填充 TextView nextAction() 方法,在 onCreateView 中使用。
【参考方案1】:
Activity.findViewById(int)' 在空对象引用上
这意味着您的getActivity()
以某种方式返回null
。
要找出为什么会发生这种情况,谷歌类似“getActivity()
返回null”。 Here 是 *** 上此类问题的一个很好的例子。
这是摆脱崩溃的解决方法。
将活动字段添加到您的片段。
活动活动;
覆盖onAttach()
方法并将值设置为activity
字段。
@Override
public void onAttach(Activity activity)
super.onAttach(activity);
this.activity = activity;
用您的activity
变量替换getActivity()
方法。
FrameLayout 容器 = (FrameLayout) activity.findViewById(R.id.flFragmentContainer);
【讨论】:
感谢您的建议。我试图按照您的建议设置一个全局变量,并偶然发现了this。但它不起作用。似乎 nextAction() 的代码在 onAttach() 方法之前执行。 (至少在我的情况下,onAttach 中的所有输出都不会显示在控制台中。)以上是关于使用在另一个片段(NPE)中生成的值设置片段的 TextView [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Android - 片段的 onActivityResult() 中的 NPE