【问题标题】:How to use ScrollView from Xamarin on Android如何在 Android 上使用 Xamarin 的 ScrollView
【发布时间】:2019-10-11 15:07:44
【问题描述】:

我的 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>

【问题讨论】:

    标签: xamarin xamarin.forms


    【解决方案1】:

    好像是Android的问题,你可以尝试在MainActivity下面添加这个LoadApplication(new App());:

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

    另一种我们需要实现名为AndroidBug5497Workaround 的解决方法,例如:

    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);
      }
    }
    

    您可以参考here

    【讨论】:

    • Xamarin.Forms.Application.Current.On&lt;Xamarin.Forms.PlatformConfiguration.Android&gt;().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize); 工作。谢谢!
    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多