android - 在继承于RelativeLayout的类中调用此方法时,findViewById返回null

标签 android android-layout onclick android-relativelayout findviewbyid

我正在尝试使用我创建的类中的 Activity_main 中的 findViewById 方法获取布局。 此类扩展了RelativeLayout,并且在构造函数中,我尝试在用户单击RelativeLayout 时为用户实现onClick 方法,这将创建另一个布局,因此我需要将该布局添加到 View 中。

这是我获取 NPE 的代码:

public class PatientBoxLayout extends RelativeLayout {

/**
 * 
 */
private Patient patient;

/**
 * Constructor de la clase Patient Box
 * 
 * @param context
 * @param patient
 */

public static double coefi = 3.3;

public PatientBoxLayout(Context aContext, Patient aPatient) {
    super(aContext);

    setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            RelativeLayout horizontalLL = (RelativeLayout) findViewById(R.id.upp_layout);
            horizontalLL.addView(new PatientBoxLayout(v.getContext(),
                    ((PatientBoxLayout) v).getPatient()));
        }
    });

这是 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"
tools:context=".MainActivity" >

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:orientation="vertical" >

            <RelativeLayout
                android:id="@+id/upp_layout"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:orientation="vertical" >

                <TextView
                    android:id="@+id/textView1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentTop="true"
                    android:layout_marginLeft="258dp"
                    android:layout_marginTop="18dp"
                    android:text="Paciente" />

                <TextView
                    android:id="@+id/textViewNomPaciente"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBottom="@+id/textView1"
                    android:layout_marginLeft="18dp"
                    android:layout_toRightOf="@+id/textView1"
                    android:text="TextView" />

                <TextView
                    android:id="@+id/textView2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignLeft="@+id/textView1"
                    android:layout_alignRight="@+id/textView3"
                    android:layout_below="@+id/textView1"
                    android:layout_marginTop="15dp"
                    android:text="Edad" />

                <TextView
                    android:id="@+id/textViewEdadPaciente"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textView2"
                    android:layout_alignBottom="@+id/textView2"
                    android:layout_alignRight="@+id/textViewNomPaciente"
                    android:text="TextView" />

                <TextView
                    android:id="@+id/textView3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignLeft="@+id/textView1"
                    android:layout_centerVertical="true"
                    android:text="Cama" />

                <TextView
                    android:id="@+id/textViewCamaPaciente"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textView3"
                    android:layout_alignBottom="@+id/textView3"
                    android:layout_alignLeft="@+id/textViewEdadPaciente"
                    android:text="TextView" />

                <TextView
                    android:id="@+id/textView4"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignLeft="@+id/textView3"
                    android:layout_below="@+id/textView3"
                    android:layout_marginTop="21dp"
                    android:text="Sexo" />

                <TextView
                    android:id="@+id/textView5"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textView4"
                    android:layout_alignBottom="@+id/textView4"
                    android:layout_alignLeft="@+id/textViewCamaPaciente"
                    android:text="TextView" />

                <TextView
                    android:id="@+id/textView6"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textViewNomPaciente"
                    android:layout_alignBottom="@+id/textViewNomPaciente"
                    android:layout_centerHorizontal="true"
                    android:text="NHC" />

                <TextView
                    android:id="@+id/textView7"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textViewEdadPaciente"
                    android:layout_alignBottom="@+id/textViewEdadPaciente"
                    android:layout_alignLeft="@+id/textView6"
                    android:text="Episodio" />

                <TextView
                    android:id="@+id/textView8"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textViewCamaPaciente"
                    android:layout_alignBottom="@+id/textViewCamaPaciente"
                    android:layout_alignLeft="@+id/textView7"
                    android:text="Diagnostico" />

                <TextView
                    android:id="@+id/textViewNHCPaciente"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textView6"
                    android:layout_alignBottom="@+id/textView6"
                    android:layout_marginLeft="33dp"
                    android:layout_toRightOf="@+id/textView8"
                    android:text="TextView" />

                <TextView
                    android:id="@+id/textViewEpisodioPaciente"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBottom="@+id/textView7"
                    android:layout_alignLeft="@+id/textViewNHCPaciente"
                    android:text="TextView" />

                <TextView
                    android:id="@+id/textViewDiagnosticoPaciente"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textView8"
                    android:layout_alignBottom="@+id/textView8"
                    android:layout_alignLeft="@+id/textViewEpisodioPaciente"
                    android:text="TextView" />

                <TextView
                    android:id="@+id/textView9"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textViewNHCPaciente"
                    android:layout_alignBottom="@+id/textViewNHCPaciente"
                    android:layout_marginLeft="79dp"
                    android:layout_toRightOf="@+id/textViewNHCPaciente"
                    android:text="FIngreso" />

                <TextView
                    android:id="@+id/textView10"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textViewEpisodioPaciente"
                    android:layout_alignBottom="@+id/textViewEpisodioPaciente"
                    android:layout_alignLeft="@+id/textView9"
                    android:text="Servicio" />

                <TextView
                    android:id="@+id/textView11"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBottom="@+id/textViewDiagnosticoPaciente"
                    android:layout_alignLeft="@+id/textView10"
                    android:text="Alergias" />

                <TextView
                    android:id="@+id/textView12"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textView5"
                    android:layout_alignBottom="@+id/textView5"
                    android:layout_alignLeft="@+id/textView11"
                    android:text="Aislado" />

                <TextView
                    android:id="@+id/textViewFIngresoPaciente"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textView9"
                    android:layout_alignBottom="@+id/textView9"
                    android:layout_marginLeft="55dp"
                    android:layout_toRightOf="@+id/textView9"
                    android:text="TextView" />

                <TextView
                    android:id="@+id/textViewServicioPaciente"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textView10"
                    android:layout_alignBottom="@+id/textView10"
                    android:layout_alignLeft="@+id/textViewFIngresoPaciente"
                    android:text="TextView" />

                <TextView
                    android:id="@+id/textViewA"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textView11"
                    android:layout_alignBottom="@+id/textView11"
                    android:layout_alignLeft="@+id/textViewServicioPaciente"
                    android:text="TextView" />

                <TextView
                    android:id="@+id/textViewAisladoPaciente"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignBaseline="@+id/textView12"
                    android:layout_alignBottom="@+id/textView12"
                    android:layout_alignLeft="@+id/textViewA"
                    android:text="TextView" />
            </RelativeLayout>
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="bottom"
            android:visibility="visible" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >

                <ScrollView
                    android:id="@+id/scrollView1"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent" >

                    <LinearLayout
                        android:id="@+id/down_layout"
                        android:layout_width="match_parent"
                        android:layout_height="0dip"
                        android:orientation="horizontal" >
                    </LinearLayout>
                </ScrollView>
                <!-- Contenido principal -->

            </LinearLayout>
        </RelativeLayout>
    </LinearLayout>
    <!-- Contenido principal -->

    <ListView
        android:id="@+id/drawer"
        android:layout_width="240dp"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:background="#EEE"
        tools:listitem="@android:layout/simple_list_item_single_choice" >
    </ListView>
</android.support.v4.widget.DrawerLayout>

</RelativeLayout>

我希望你能帮助我从类的构造函数中识别布局。

谢谢。 问候

最佳答案

如果您查看文档:https://developer.android.com/reference/android/app/Activity.htmlhttps://developer.android.com/reference/android/view/View.html Activity 和 View 都有一个 findViewById 方法。

因此,当您在 PatientBoxLayout 内调用 findViewById(R.id.upp_layout); 时,会尝试仅在其自己的布局树内查找该 View 。它找不到,因为它不在那里。因此它返回 null,并且您会在下一行因 NullPointerException 崩溃。

您可以调用 getParent() 在布局层次结构中向上导航,然后调用 findViewById(R.id.upp_layout); 或者更好的解决方案是不要将 ClickListener 放入 View 或 viewGroup 中。这些并不是为了处理点击。您应该处理 Activity 或 Fragment 上的点击。

关于android - 在继承于RelativeLayout的类中调用此方法时,findViewById返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20519026/

相关文章:

android - 创建纯 CSS3 Material 拨动开关

Jquery Sortable - 排序时禁用 onclick =""

android - Onclick 监听器无法正常工作..?

javascript - 如何在 JS 确认消息中添加新行以在单击链接时显示?

android - 如何调用非默认浏览器?

android - RecyclerView 中的项目未按预期对齐

android - Sqlite自增列问题

java - 在RelativeLayout上检测多点触摸

android - GLSurfaceView透明背景

android - 椭圆在android中是什么意思?