java.lang.NullPointerException:尝试调用虚方法' void android.widget.CardView.setVisibility(int)'在空对象引用

时间:2018-03-24 07:15:01

标签: java android android-fragments android-linearlayout android-cardview

我正在尝试按下FAB时为Cardview设置动画。我想得到圆形动画。最初Cardview设置为Invisible。但是,它正在对CardView.setVisibility进行trowing null对象引用。

public class FeedFragment extends Fragment {

private FloatingActionButton floatingBtn;
private CardView cardView;
boolean flag = true;
public FeedFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_feed, container, false);

    floatingBtn = view.findViewById(R.id.floatBtn);
    cardView = view.findViewById(R.id.cardView);

    floatingBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if(flag) {

                // Check if the runtime version is at least Lollipop
                if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
                    // get the center for the clipping circle
                    int cx = cardView.getWidth() / 2;
                    int cy = cardView.getHeight() / 2;

                    // get the final radius for the clipping circle
                    float finalRadius = (float) Math.hypot(cx, cy);

                    // create the animator for this view (the start radius is zero)
                    Animator anim =
                            ViewAnimationUtils.createCircularReveal(cardView, cx, cy, 0, finalRadius);

                    // make the view visible and start the animation
                    cardView.setVisibility(View.VISIBLE);
                    anim.start();
                } else {
                    // set the view to visible without a circular reveal animation below Lollipop
                    cardView.setVisibility(View.VISIBLE);
                }

                flag = false;
            } else {

                // Check if the runtime version is at least Lollipop
                if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
                    // get the center for the clipping circle
                    int cx = cardView.getWidth() / 2;
                    int cy = cardView.getHeight() / 2;

                    // get the initial radius for the clipping circle
                    float initialRadius = (float) Math.hypot(cx, cy);

                     // create the animation (the final radius is zero)
                    Animator anim =
                            ViewAnimationUtils.createCircularReveal(cardView, cx, cy, initialRadius, 0);

                   // make the view invisible when the animation is done
                    anim.addListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            super.onAnimationEnd(animation);
                            cardView.setVisibility(View.INVISIBLE);
                        }
                    });

                 // start the animation
                    anim.start();
                } else {
                    // set the view to visible without a circular reveal animation below Lollipop
                    cardView.setVisibility(View.VISIBLE);
                }
                flag = true;
            }

        }
    });

    return view;
   }
  }

这是XML代码

<FrameLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.authent.authentication.FeedFragment">

<!-- TODO: Update blank fragment layout -->

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

    <android.support.v7.widget.CardView
        android:id="@+id/cardView"
        android:layout_width="match_parent"
        android:layout_height="208dp"
        android:layout_gravity="bottom"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginStart="16dp"
        app:cardCornerRadius="20dp"
        android:visibility="gone">

        <LinearLayout
            android:id="@+id/linearReveal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:visibility="gone">

            <Button
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:background="@color/white"
                android:text="Ask a Query"
                android:textSize="24dp"
                android:textAllCaps="false"
                android:textColor="#00ccff"/>

            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="@android:color/darker_gray"/>

            <Button
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:background="@color/white"
                android:text="Share Something"
                android:textSize="24dp"
                android:textAllCaps="false"
                android:textColor="#ff3300"/>

            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="@android:color/darker_gray"/>

            <Button
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:background="@color/white"
                android:text="Post an MCQ"
                android:textSize="24dp"
                android:textAllCaps="false"
                android:textColor="#cc9900"/>

        </LinearLayout>

    </android.support.v7.widget.CardView>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/floatBtn"
        android:layout_width="56dp"
        android:layout_height="56dp"
        android:layout_gravity="end"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="16dp"
        android:layout_marginRight="16dp"
        android:src="@drawable/edit_nick_name" />

</LinearLayout>

有人帮助如何实现圆形动画。我是编程新手。 我也试过使LinearLayout INVISIBLE,它也在null对象引用上的LinearLayout.setVisibility上抛出NullPointerException。 提前谢谢。

3 个答案:

答案 0 :(得分:0)

在&#34; clickListener&#34;。

之外推广cardview

答案 1 :(得分:0)

您只需删除此行void function(My_Object* p_returned_object) { new (p_returned_object) My_Object{ a, b, c }; }

即可

并在

之前粘贴它
cardView = view.findViewById(R.id.cardView);

答案 2 :(得分:-1)

您的CardView为空。根据您的代码,您尝试从收到CardView的{​​{1}}的视图中获取onClick

尝试在侦听器之前调用外部初始化。理想情况下与初始化FloatingButton

的级别相同