Как использовать ScrollView от Xamarin на Android - PullRequest
0 голосов
/ 10 октября 2019

Мое содержание XAML ниже. Моя проблема в том, что когда я нажимаю на поле ввода для ввода текста, появляется экранная клавиатура, но я не могу прокрутить представление на Android. Представление прокручивает на iOS.

Что-то я делаю неправильно или это ошибка? Я использую Xamarin.Forms 4.2.0.848062

Я пытался закомментировать <Grid>, но это тоже не помогло.

<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:d="http://xamarin.com/schemas/2014/forms/design"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <ContentPage.Content>
        <ScrollView>
            <StackLayout>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="250" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <Grid>
                        <Image
                            x:Name="imageToUpload"
                            Grid.Row="0"
                            Aspect="AspectFill"
                            HorizontalOptions="FillAndExpand"
                            VerticalOptions="FillAndExpand" />
                        <Image Grid.Row="0" IsVisible="{Binding HasImage, Converter={StaticResource InverseBoolConverter}}">
                            <Image.GestureRecognizers>
                                <TapGestureRecognizer NumberOfTapsRequired="1" Tapped="OnPhotoImageTap" />
                            </Image.GestureRecognizers>
                            <Image.Source>
                                <FontImageSource
                                    FontFamily="{DynamicResource MaterialFontFamily}"
                                    Glyph="{StaticResource ImagePlusIcon}"
                                    Size="200" />
                            </Image.Source>
                        </Image>
                    </Grid>
                </Grid>

                <Entry
                    x:Name="Description"
                    Margin="30,20,30,0"
                    FontFamily="{StaticResource RegularFont}"
                    IsVisible="{Binding HasImage}"
                    Placeholder="{Binding DescriptionEntryPlaceholder}"
                    Text="{Binding Upload.Comment}" />

                <Grid
                    Margin="25,0,30,0"
                    HorizontalOptions="FillAndExpand"
                    IsVisible="{Binding HasImage}"
                    VerticalOptions="Start">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="0.1*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <CheckBox
                        x:Name="EmailPhoto"
                        Grid.Row="0"
                        Grid.Column="0"
                        IsChecked="{Binding EmailPhoto}"
                        VerticalOptions="Center" />
                    <Label
                        Grid.Row="0"
                        Grid.Column="1"
                        FontFamily="{StaticResource RegularFont}"
                        FontSize="14"
                        Text="Email Photo"
                        VerticalOptions="Center" />
                </Grid>

                <Entry
                    x:Name="EmailAddressEntry"
                    Margin="30,0,30,20"
                    FontFamily="{StaticResource RegularFont}"
                    IsVisible="{Binding EmailPhoto}"
                    Keyboard="Email"
                    Placeholder="Email Address"
                    Text="{Binding Upload.EmailPhotoAddress}" />

                <Button
                    Grid.Row="4"
                    Grid.Column="1"
                    Clicked="OnSubmitClicked"
                    FontFamily="{StaticResource RegularFont}"
                    IsVisible="{Binding HasImage}"
                    Text="Submit Photo" />
            </StackLayout>
        </ScrollView>
    </ContentPage.Content>
</ContentPage>

1 Ответ

1 голос
/ 11 октября 2019

похоже, проблема Android, вы можете попытаться добавить это ниже MainActivity LoadApplication(new App());:

Xamarin.Forms.Application.Current.On<Xamarin.Forms.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize);

Другой способ, которым нам нужно реализоватьОбходное имя с именем AndroidBug5497Обход как:

public class AndroidBug5497WorkaroundForXamarinAndroid

{

// For more information, see https://code.google.com/p/android/issues/detail?id=5497
// To use this class, simply invoke assistActivity() on an Activity that already has its content view set.

// CREDIT TO Joseph Johnson (http://stackoverflow.com/users/341631/joseph-johnson) for publishing the original Android solution on stackoverflow.com

public static void assistActivity(Activity activity)
{
    new AndroidBug5497WorkaroundForXamarinAndroid(activity);
}

private Android.Views.View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;

private AndroidBug5497WorkaroundForXamarinAndroid(Activity activity)
{
    FrameLayout content = (FrameLayout)activity.FindViewById(Android.Resource.Id.Content);
    mChildOfContent = content.GetChildAt(0);
    ViewTreeObserver vto = mChildOfContent.ViewTreeObserver;
    vto.GlobalLayout += (object sender, EventArgs e) => {
                         possiblyResizeChildOfContent();
                         };
    frameLayoutParams = (FrameLayout.LayoutParams)mChildOfContent.LayoutParameters;
}

private void possiblyResizeChildOfContent()
{
    int usableHeightNow = computeUsableHeight();
    if (usableHeightNow != usableHeightPrevious)
    {
        int usableHeightSansKeyboard = mChildOfContent.RootView.Height;
        int heightDifference = usableHeightSansKeyboard - usableHeightNow;

        frameLayoutParams.Height = usableHeightSansKeyboard - heightDifference;

        mChildOfContent.RequestLayout();
        usableHeightPrevious = usableHeightNow;
    }
}

private int computeUsableHeight()
  {
    Rect r = new Rect();
    mChildOfContent.GetWindowVisibleDisplayFrame(r);
    return (r.Bottom - r.Top);
  }
}

Вы можете сослаться на здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...