我是Android开发的新手,当然还有Fragments。
我想在main活动中访问我片段的控件,但'findViewById'返回null。 没有片段,代码工作正常。
这是我的代码的一部分:
片段:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:ignore="HardcodedText" >
<EditText
android:id="@+id/txtXML"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:ems="10"
android:scrollbars="vertical">
</EditText>
</LinearLayout>
MainActivity的onCreate:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.initialisePaging();
EditText txtXML = (EditText) findViewById(R.id.txtXML);}
此时 txtXML 为空。
我的代码中缺少什么或我应该怎么做?
答案 0 :(得分:19)
在onCreateView
上的片段上尝试这样public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (container == null) {
return null;
}
LinearLayout ll = (LinearLayout )inflater.inflate(R.layout.tab_frag1_layout, container, false);
EditText txtXML = (EditText) ll.findViewById(R.id.txtXML);
return ll;
}
答案 1 :(得分:16)
您应该inflate
onCreateView
Fragment
findViewById
方法上的片段布局,然后您可以在Activity
上使用inflate
访问该元素。
在此示例中,我的片段布局是LinearLayout,因此我将 public class FrgResults extends Fragment
{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//some code
LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.frg_result, container, false);
//some code
return ll;
}
}
结果转换为LinearLayout。
{{1}}
答案 2 :(得分:5)
我迟到了,但对于有这个问题的其他人来说。您应该在onCreateView方法中膨胀您的视图。然后覆盖onCreateActivity
方法,您可以在那里使用getView().findViewById
。
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment, container, false);
}
答案 3 :(得分:3)
您无法通过findViewById
访问活动类中片段的视图,而是您可以做的...
您的活动文件中必须有Fragment类的对象,对吧?在该片段类中创建EditText类的getter方法,并在您的活动中访问该方法。
在需要Edittext obj。
的事件中,在Fragment类中创建一个回调答案 4 :(得分:2)
1)试试这个:
Eclipse菜单 - &gt;项目 - &gt;清洁...
<强>更新强>
2)如果您有2个或更多'main'布局实例,请检查它们是否都有一个带有'txtXML'id的视图
3)
Fragment是应用程序的用户界面或行为的一部分,可以放在Activity中。与片段的交互是通过FragmentManager完成的,可以通过Activity.getFragmentManager()和Fragment.getFragmentManager()获得。
Fragment类可以通过多种方式实现各种结果。它是核心,它代表在较大的Activity中运行的特定操作或接口。片段与它所处的活动密切相关,不能与一个片段分开使用。尽管Fragment定义了自己的生命周期,但生命周期依赖于它的活动:如果活动停止,则其中的任何碎片都不能启动;当活动被破坏时,所有碎片都将被销毁。
研究this。你必须使用FragmentManager。
答案 5 :(得分:0)
如果你想在活动onCreate中使用findViewById,你可以简单地将所有重叠方法放在onActivityCreated上。
答案 6 :(得分:0)
以上所有答案都告诉您应该如何“返回布局”,但并没有确切告诉您如何引用返回的布局,因此我无法使用任何给定的解决方案。我使用了另一种方法来解决问题。在处理片段的Fragment类中,进入onViewCreated()
类并在其中创建一个上下文变量,该变量保存父活动(在我的情况下为主要活动)的上下文。
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Context fragmentContext = (MainActivity) view.getContext();
}
完成后,您可以使用新上下文从onViewCreated()
方法内部访问片段上的项目。
EditText editText = context.findViewById(R.id.textXML);