我是Android开发的新手,我想制作简单的应用程序。我有一个 MainActivity 的活动,我在该活动中有一个片段 MainFragment 。我想从Activity onCreate和/或onResume更改此片段的TextView。但是,我无法处理。我的onCreate活动方法是:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new MainFragment()).commit();
}
TextView tv = (TextView) getSupportFragmentManager().findFragmentById(R.layout.fragment_main).getView().findViewById(R.id.textView1);
}
我在这里获取TextView时有NullPointerException。我认为它无法通过findFragmentById(R.layout.fragment_main)
找到片段。因为我有fragment_main.xml,它是:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.deneme.MainFragment" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</RelativeLayout>
My MainFragment Class&#39; onCreateView方法是:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
我不希望在onCreate方法中更改片段的textview文本。我希望从活动中更改。我的问题是什么?
由于
答案 0 :(得分:1)
这里有一些你需要解决的问题。 正如资深的安卓人员会告诉你的那样,从活动中改变片段的观点并不是一件好事。将活动视为它创造的碎片的“母亲”。如果母亲开始做孩子的家庭作业那么孩子们会做什么呢?片段的视图应该从片段内部处理,而不是在片段外部处理。更进一步,因为片段可能在屏幕上不可见,因此android内核将决定销毁它并将其GC。如果你继续保持对其观点的引用,那么它将浪费内存和资源。
但如果你仍然想那样:
但我仍然敦促你让片段进行自己的视图处理,而不是在活动和片段之间混合视图处理,也不要在两个或多个片段之间混合。这是一个很大的设计,没有。
答案 1 :(得分:1)
好吧,
这不是你想要的。
您应该将片段中的UI更新作为公共方法实现,并在需要时从Activity中调用它。
这更优雅,你应该能够用这种模式取得任何成果。如果没有,那么这就是组件设计不良的标志,你应该考虑重构。
<强>更新强>
很容易:)
YourFragment frag = (YourFragment)getSupportFragmentManager().findFragmentById(R.layout.fragment_main);
if(frag != null){
frag.updateTextView();
}