尝试在空对象引用上调用虚拟方法'void android.view.View.resolveLayoutParams()'

时间:2019-05-22 09:11:33

标签: xamarin.android

我有一个ScrollView添加到FrameLayout。在一个按钮中,单击我从FrameLayout中删除ScrollView并添加一个从ViewGroup派生的元素。如果再次单击该按钮,则将删除ViewGroup,并重新添加ScrollView。在删除ViewGroup之后将ScrollView重新添加回FrameLayout时,我从FrameLayout的AddView方法中得到以下异常。实际上,它是从ViewGroup类的AddView()方法抛出的,因为FrameLayout是从ViewGroup派生的。

  

未处理的异常:

     

Java.Lang.NullPointerException:尝试调用虚拟方法'void   空对象引用上的android.view.View.resolveLayoutParams()'   发生

我已经尝试切换两个视图的可见性,而不是添加一个视图并删除另一个视图。但是在切换可见性之后,每次调用FrameLayout的OnLayout时,例如当出现Android键盘或设备方向发生更改时,应用程序都会崩溃。

很抱歉,我无法提供代码。因为我的代码非常复杂,所以我无法在一个简单的示例中重现此问题。我刚刚将此问题发布为不得已。

我知道,如果不包含代码,则不可能获得解决方案。但是,与此问题相关的任何输入都会有所帮助。

1 个答案:

答案 0 :(得分:0)

由于您无法在此处提供代码,因此我只能编写部分代码以显示您的要求:

在xaml中,我将ScrolView(及其子级)和LinearLayout(作为ViewGroup)添加到FrameLayout中:

<?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"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
<FrameLayout 
    android:id="@+id/framelayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above = "@+id/click"
    >
   <ScrollView 
        android:id="@+id/scroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"    
        >
      <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="match_parent"  
            >
        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text ="text in scrollview"
            />

        </LinearLayout>

    </ScrollView>
  <LinearLayout
        android:id="@+id/linearlayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"    
        android:visibility="gone"
            >
        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text ="text iFn LinearLayout"
            />

        </LinearLayout>
</FrameLayout>
<Button  
    android:id = "@+id/click"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"    
    android:text="click"
    android:layout_alignParentBottom="true"
/>
</RelativeLayout>

在活动中,通过单击按钮显示和隐藏Scrolview和LinearLayout:

  private int num = 1;
  protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);        
        Button button = FindViewById<Button>(Resource.Id.click);
        FrameLayout frameLayout = FindViewById<FrameLayout>(Resource.Id.framelayout);
        ScrollView scrollView = FindViewById<ScrollView>(Resource.Id.scroll);
        LinearLayout linearLayout = FindViewById<LinearLayout>(Resource.Id.linearlayout);
        button.Click += delegate
        {
            if (num % 2 ==0)
            {
                scrollView.Visibility = Android.Views.ViewStates.Gone;
                linearLayout.Visibility = Android.Views.ViewStates.Visible;
            }
            else
            {
                linearLayout.Visibility = Android.Views.ViewStates.Gone;
                scrollView.Visibility = Android.Views.ViewStates.Visible;
            }
            num++;
        };
    }