简体   繁体   English

Android-相对布局中的空指针参考

[英]Android - Null pointer reference in Relative Layout

I've made a small class to change layout sizes. 我开了一小堂课来更改布局大小。

Here's the class : 这是课程:

import android.app.Activity;
import android.util.DisplayMetrics;


public class LayoutResize extends Activity{

    public DisplayMetrics displayMetrics = new DisplayMetrics();

    public int width(int sizeX, DisplayMetrics displayMetrics)
    {
        int screenWidth = displayMetrics.widthPixels * sizeX / 100;
        return screenWidth;
    }

    public int height(int sizeY, DisplayMetrics displayMetrics)
    {
        int screenHeight = displayMetrics.heightPixels * sizeY / 100;
        return screenHeight;
    }
}

And I use it this way in my MainActivity 我在MainActivity这种方式使用它

public class MainActivity extends AppCompatActivity {

    DisplayMetrics displayMetrics = new DisplayMetrics();
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        LayoutResize layoutResize = new LayoutResize();

        RelativeLayout relativeViewPager =(RelativeLayout) findViewById(R.id.relativeViewPager);
        int relativeViewPagerHeight = layoutResize.height(70, displayMetrics);
        ViewGroup.LayoutParams viewPagerParams = relativeViewPager.getLayoutParams();
        viewPagerParams.height = relativeViewPagerHeight;
        relativeViewPager.setLayoutParams(viewPagerParams);


        RelativeLayout headerLayout =(RelativeLayout) findViewById(R.id.headerLayout);
        int headerLayoutHeight = layoutResize.height(70, displayMetrics);
        ViewGroup.LayoutParams headerLayoutParams = headerLayout.getLayoutParams();
        headerLayoutParams.height = headerLayoutHeight;
        headerLayout.setLayoutParams(headerLayoutParams);
}

It returns Attempt to invoke virtual method 'android.view.ViewGroup$LayoutParams android.widget.RelativeLayout.getLayoutParams()' on a null object reference . 它返回Attempt to invoke virtual method 'android.view.ViewGroup$LayoutParams android.widget.RelativeLayout.getLayoutParams()' on a null object reference

If I only use it once, for example only : 如果我只使用一次,例如:

RelativeLayout relativeViewPager =(RelativeLayout) findViewById(R.id.relativeViewPager);
            int relativeViewPagerHeight = layoutResize.height(70, displayMetrics);
            ViewGroup.LayoutParams viewPagerParams = relativeViewPager.getLayoutParams();
            viewPagerParams.height = relativeViewPagerHeight;
            relativeViewPager.setLayoutParams(viewPagerParams);

It works, but if I use it like the way I've shown which is twice, it throws null object reference.. 它可以工作,但是如果我像显示两次那样使用它,则会抛出空对象引用。

XML of items in ViewPager ViewPager中项目的XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center" >

    <RelativeLayout
        android:id="@+id/headerLayout"
        android:layout_width="match_parent"
        android:layout_height="fill_parent" >

        <ImageView
            android:id="@+id/slidingBackground"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true" />

        <RelativeLayout
            android:id="@+id/headerText"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/titleText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/messageText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:layout_below="@+id/titleText" />

        </RelativeLayout>

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/slidingImageWrapper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/headerLayout">

        <ImageView
            android:id="@+id/slidingImage"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </RelativeLayout>


</RelativeLayout>

Here's the XML for the main class itself 这是主类本身的XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/relativeViewPager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
        android:fillViewport="true"
        android:measureAllChildren="false"
        android:scrollbars="none" >

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_alignParentTop="true" />

    </RelativeLayout>



    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_below="@+id/relativeViewPager">

        <com.viewpagerindicator.CirclePageIndicator
            android:id="@+id/indicator"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:gravity="bottom"
            android:padding="10dip"
            app:centered="true"
            app:fillColor="#ff0099"
            app:pageColor="#FF0000"
            app:snap="false" />

        <Button
            android:id="@+id/loginButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Login"
            android:textColor="#ffffff"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="10dp"
            android:layout_marginBottom="10dp"
            android:background="@drawable/login_button" />

        <Button
            android:id="@+id/signUpButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Signup"
            android:textColor="#ffffff"
            android:layout_alignTop="@+id/loginButton"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_marginRight="63dp"
            android:layout_marginEnd="63dp"
            android:background="@drawable/signup_button" />

    </RelativeLayout>


</RelativeLayout>

I did a stupid mistake of not inflating the view I use (I use another xml which I forgot to inflate) 我犯了一个愚蠢的错误,即没有夸大我使用的视图(我使用了另一个我忘了夸大的xml)

Had to add : 必须添加:

LayoutInflater  inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View pagerItemInflater = (View) inflater.inflate(R.layout.viewpager_item, null);

And use it like this : 并像这样使用它:

RelativeLayout headerLayout = (RelativeLayout) pagerItemInflater.findViewById(R.id.headerLayout);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM