如何在键盘正上方定位视图?

时间:2016-09-07 12:12:19

标签: user-interface xamarin xamarin.android xamarin.forms

我正在编写一个Forms应用程序。如何在屏幕底部放置视图,当某些条目聚焦且键盘可见时,视图位于键盘正上方?在Android上,可以设置Window.SetSoftInputMode(SoftInput.AdjustResize),这将使每次键盘出现/消失时Content调整大小。但是,我需要状态栏是透明的,而SoftInput.AdjustResize不适用于WindowManagerFlags.TranslucentStatus。我的问题是,如何在不设置SoftInput.AdjustResize的情况下在键盘正上方放置视图?

举个例子:

    public Page1()
    {
        InitializeComponent();

        var al = new StackLayout
        {
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand
        };

        var button = new BoxView {Color = Color.Red, VerticalOptions = LayoutOptions.EndAndExpand};

        var entry = new Entry {HorizontalOptions = LayoutOptions.Fill};


        al.Children.Add(entry);

        al.Children.Add(button);

        Content = al;

        Content.SizeChanged += (sender, args) =>
        {
            button.Layout(new Rectangle(0, Content.Height - 120, App.Dimensions.Width, 120));
        };

    }

如果您运行此代码,当您按下输入时,什么都不会改变,由于键盘重叠,“按钮”将保持在屏幕底部不可见。

如果我们在MainActivity的onCreate中添加Window.SetSoftInputMode(SoftInput.AdjustResize)它工作正常,则框会在条目焦点上移动到键盘上方。

此外,如果我们将Content = al;更改为Content = new ScrollView {Content = al};,则可以正常使用。

但是,如果我们在MainActivity的onCreate中添加Window.AddFlags(WindowManagerFlags.TranslucentStatus);,则这些方法都不再有效。

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

我正在编写一个Forms应用程序。如何将视图定位在底部   屏幕,当某些条目聚焦并且键盘可见时,   视图位于键盘正上方?

如果您使用的是Xamarin Forms,那么将您的UI元素包装在ScrollView中应该可以解决问题。如果你使用的是XAML,那会是这样的:

<ScrollView>
    <ScrollView.Content>
        //  Your Original XAML content here
    </ScrollView.Content>
<ScrollView

编辑:

看看你刚刚添加的例子,我想我知道发生了什么。因此,ScrollView Trick仅适用于需要键盘输入的元素。即如果您在屏幕底部有一个入口元素,并且像我建议的那样将所有内容包装在ScrollView中,那么键盘应该为您推送入口元素。但是在你的情况下,屏幕底部有一个框视图,键盘只是在其上运行。

您对Content.SizedChanged所拥有的是一个好主意,但是我不认为当键盘弹出时视图的大小实际发生了变化(至少,当调用时没有调用Content.SizeChanged)键盘弹出),因此部分代码实际上只在从您提供的MCVE加载页面时被调用。

但是,我能够移动按钮&#39;键盘出现时执行此操作:

替换

Content.SizeChanged += (sender, args) =>
{
    button.Layout(new Rectangle(0, Content.Height - 120, App.Dimensions.Width, 120));
};

使用

entry.Focused += (sender, e) => 
{
    button.TranslationY -= 120;
};

你可能有时间获得所有不同设备和方向的神奇翻译号码。当我在iPhone 6模拟器上进行测试时,我必须先将其推到120以上,然后才能在键盘上方看到它。

希望有所帮助!