使用包含布局时的NPE

时间:2016-06-28 07:44:19

标签: android xml android-fragments

我正在尝试从父片段访问另一个片段。当我使用" include"在布局中,应用程序返回NPE。我从其他帖子中读到,你需要实例化包含的布局。我的代码有什么问题?我也尝试将其作为视图进行实例化,并且仍然给我NPE。当我注释掉包含标签时,应用程序正常工作。

FATAL EXCEPTION: main
    Process: lee.guide.ffbe.com.braveexviusguide, PID: 4388
    java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getVisibility()' on a null object reference
        at android.widget.LinearLayout.hasDividerBeforeChildAt(LinearLayout.java:637)
        at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1155)
        at android.widget.TableRow.onMeasure(TableRow.java:114)
        at android.view.View.measure(View.java:18417)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5801)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1835)
        at android.widget.TableLayout.measureChildBeforeLayout(TableLayout.java:464)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:725)
        at android.widget.TableLayout.measureVertical(TableLayout.java:476)
        at android.widget.TableLayout.onMeasure(TableLayout.java:439)
        at android.view.View.measure(View.java:18417)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:18417)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5801)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1835)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:725)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:616)
        at android.view.View.measure(View.java:18417)
        at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:2015)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.widget.ScrollView.onMeasure(ScrollView.java:484)
        at android.view.View.measure(View.java:18417)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:18417)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:18417)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:18417)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5801)
        at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:668)
        at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90)
        at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1170)
        at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:733)
        at android.view.View.measure(View.java:18417)
        at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1075)
        at android.view.View.measure(View.java:18417)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5801)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
        at android.view.View.measure(View.java:18417)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5801)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1835)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:725)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:616)
        at android.view.View.measure(View.java:18417)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5801)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:18417)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5801)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1835)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:725)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:616)

这是我想要包含的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/table_esper_header"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="left">

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_weight="100"
            android:background="@android:color/holo_blue_light"
            android:gravity="center"
            android:padding="10dp"
            android:showDividers="middle|beginning|end"
            android:textAlignment="center">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_column="1"
                android:layout_weight="25"
                android:gravity="center"
                android:text="@string/status"
                android:textColor="#FFFFFF"
                android:textSize="14sp" />

            <TextView
                android:id="@+id/textClock"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_column="2"
                android:layout_weight="25"
                android:gravity="center"
                android:text="        Initial"
                android:textColor="#FFFFFF" />

            <TextView
                android:id="@+id/textClock1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_column="2"
                android:layout_weight="25"
                android:gravity="center"
                android:text="    Max 1*"
                android:textColor="#FFFFFF" />

            <TextView
                android:id="@+id/textClock2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_column="2"
                android:layout_weight="25"
                android:gravity="center"
                android:text="Max 2*"
                android:textColor="#FFFFFF" />
        </TableRow>

    </TableLayout>
</RelativeLayout>

以下是我打电话的方式&#34; table_esper_header&#34;:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/siren_stats"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >

    <ImageView
        android:layout_width="@dimen/espersize"
        android:layout_height="@dimen/espersize"
        android:layout_gravity="top|center"
        android:id="@+id/imgEsperInfo"
        android:scaleType="fitXY"
        android:layout_marginTop="15dp"
        android:layout_marginBottom="15dp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/esper_name"
        android:layout_gravity="top|center"
        android:textSize="15sp"
        android:textColor="#000000"
        android:layout_marginBottom="15dp"
        android:typeface="sans" />


    <include layout="@layout/table_esper_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ></include>

    <!--<include layout="@layout/table_esper_stats"-->
        <!--android:layout_height="wrap_content"-->
        <!--android:layout_width="match_parent"></include>-->
</LinearLayout>
    </ScrollView>
</RelativeLayout>

在我的片段类中,我实例化了包含的布局:

public class EsperInfo extends Fragment {

    DatabaseReference root = FirebaseDatabase.getInstance().getReference();
    String espername;
    Bundle bundle;
    ImageView imgEsper;
    TextView esper_name;
    RelativeLayout table_header;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.esper_info, container, false);
        esper_name = (TextView)v.findViewById(R.id.esper_name);
        imgEsper = (ImageView) v.findViewById(R.id.imgEsperInfo);
        Log.v("INSTANTIATEEE", "INCLUDEEE MEEE");
        //crashes after this line
        table_header = (RelativeLayout) v.findViewById(R.id.table_esper_header);
        Log.v("INSTANTIATEEE", "INCLUDEEE MEEE2");
        bundle = this.getArguments();
        espername = bundle.getString("espername", espername);
        setImageResource(espername);
        espername =  espername.substring(0,1).toUpperCase() + espername.substring(1).toLowerCase();
        esper_name.setText(espername) ;
//        Log.v("BUNDLEEEEE", espername);

        return v;
    }

        public void setImageResource(String espername){
            if (espername == "siren"){
                imgEsper.setBackgroundResource(R.mipmap.siren2);
            }
            else if (espername == "ifrit"){
                imgEsper.setBackgroundResource(R.mipmap.ifrit2);
            }
            else if (espername == "golem"){
                imgEsper.setBackgroundResource(R.mipmap.golem2);
            }
            else if (espername == "shiva"){
                imgEsper.setBackgroundResource(R.mipmap.shiva);
            }
        }
    public void retrieveEsper (){
        DatabaseReference esperRoot = FirebaseDatabase.getInstance().getReference();
        esperRoot.child("esper").child("ifrit").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                EsperStatsModel esperstats = dataSnapshot.getValue(EsperStatsModel.class);
                Log.v("FIREBASE_SAMPLE", esperstats.getAttack1());
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

我觉得这很奇怪但是当我删除这一行时它运行良好:

android:showDividers="middle|beginning|end"