У меня есть ScrollView, добавленный в FrameLayout. Нажав кнопку, я удаляю ScrollView из FrameLayout и добавляю элемент, производный от ViewGroup. При повторном нажатии кнопки ViewGroup удаляется, а ScrollView добавляется обратно. При добавлении ScrollView обратно в FrameLayout после удаления ViewGroup я получаю следующее исключение из метода AddView FrameLayout. На самом деле он выбрасывается из метода AddView() класса ViewGroup, поскольку FrameLayout является производным от ViewGroup.
Unhandled Exception:
Java.Lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.resolveLayoutParams()' on a null object reference occurred
Я уже пытался переключать видимость обоих представлений вместо добавления одного и удаления другого. Но после переключения видимости приложение аварийно завершает работу каждый раз, когда вызывается OnLayout FrameLayout, например, когда появляется клавиатура Android или изменяется ориентация устройства.
Мне жаль, что я не могу предоставить код. Потому что мой код очень сложный и я не смог воспроизвести эту проблему на простом примере. Я просто разместил этот вопрос в крайнем случае.
Я знаю, что невозможно получить решение, если код не включен. Но любой вклад, связанный с этой проблемой, будет полезен.
Поскольку вы не можете предоставить код здесь, я могу написать только часть кода, чтобы показать ваши требования:
в xaml я добавляю ScrollView (с его дочерними элементами) и 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>
в действии покажите и скройте Scrollview и 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++;
};
}
@LeoZhu-MSFT Это работает. Спасибо большое.