Как проверить, соответствует ли элемент управления области экрана или находится вне диапазона?

#c# #android #xamarin #xamarin.android

#c# #Android #xamarin #xamarin.android

Вопрос:

Я очень признателен, если кто-нибудь с терпением сможет исправить мой код (кодирование — это не моя работа).

Нажимая button1 , я бы проверил, находится ли элемент управления как a TextView в настоящее время за пределами экрана, как следствие, существует множество элементов управления в зависимости от размера экрана устройства, но я не знаю, как это сделать. (Я все еще проверял другой подобный пост, но я не понял, так что извините, но именно поэтому я здесь)

Это мой Activity.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <GridLayout
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:columnCount="5"
        android:rowCount="6"
        android:id="@ id/gridLayout1">
        <RadioButton
            android:text="Total:"
            android:layout_columnWeight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@ id/radioButtonFT"
            android:checked="true" 
            android:tooltipText="Fissa % di H2O" />
        <EditText
            android:layout_columnWeight="1"
            android:inputType="numberDecimal"
            android:id="@ id/editTextTotFlour"
            android:maxWidth="150px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="10"
            android:gravity="right" />
        <TextView
            android:text="kg"
            android:layout_columnWeight="1"
            android:maxWidth="30px"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textView2"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
        <EditText
            android:layout_columnWeight="1"
            android:inputType="numberDecimal"
            android:id="@ id/editTextTotFlourPer100"
            android:maxWidth="150px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="100"
            android:enabled="false"
            android:gravity="right" />
        <TextView
            android:text="%"
            android:layout_columnWeight="1"
            android:maxWidth="30px"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textView3"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
        <RadioButton
            android:text="H2O:"
            android:layout_columnWeight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@ id/radioButtonH2O" />
        <EditText
            android:layout_columnWeight="1"
            android:inputType="numberDecimal"
            android:id="@ id/editTextH2O"
            android:maxWidth="150px"
            android:text="6"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:gravity="right" />
        <TextView
            android:text="l"
            android:layout_columnWeight="1"
            android:maxWidth="30px"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textView11"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
        <EditText
            android:layout_columnWeight="1"
            android:inputType="numberDecimal"
            android:id="@ id/editTextH2OPer100"
            android:maxWidth="150px"
            android:text="60"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:gravity="right" />
        <TextView
            android:text="%"
            android:layout_columnWeight="1"
            android:maxWidth="30px"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textView12"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
        <TextView
            android:text=" Something:"
            android:layout_columnWeight="1"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textView13"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
        <EditText
            android:inputType="numberDecimal"
            android:layout_columnWeight="1"
            android:id="@ id/editTextSaltPer100"
            android:maxWidth="150px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="35"
            android:gravity="right" />
        <TextView
            android:text="g"
            android:layout_columnWeight="1"
            android:maxWidth="30px"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textView14"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
        <EditText
            android:inputType="numberDecimal"
            android:layout_columnWeight="1"
            android:id="@ id/editTextSalt"
            android:maxWidth="150px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="21"
            android:gravity="right" />
        <TextView
            android:text="g"
            android:layout_columnWeight="1"
            android:maxWidth="30px"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textView15"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
    </GridLayout>

    <RelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="20px"
        android:layout_weight="0" 
        android:id="@ id/relativeLayout1">
        <View
            android:layout_columnWeight="1"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/viewDivider"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_centerVertical="true"
            android:background="#808080" />
    </RelativeLayout>

    <GridLayout  
        android:minWidth="25px"
        android:minHeight="25px"    
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:columnCount="6"
        android:rowCount="4"
        android:id="@ id/gridLayout2">
        <TextView
            android:layout_columnWeight="1"
            android:layout_columnSpan="6"
            android:text="Temperature"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@ id/textViewTH20"
            android:gravity="center_horizontal" />
        <TextView
            android:layout_columnWeight="1"
            android:text=" Ti:"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textViewTI"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" 
            android:textAlignment="textEnd" />
        <EditText
            android:layout_columnWeight="1"
            android:inputType="numberDecimal"
            android:id="@ id/editTextTI"
            android:maxWidth="150px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="21"
            android:gravity="right" />
        <TextView
            android:text="°"
            android:layout_columnWeight="1"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textView21"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
        <TextView
            android:layout_columnWeight="1"
            android:text="Ta:"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textViewTA"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:textAlignment="textEnd" />
        <EditText
            android:layout_columnWeight="1"
            android:inputType="numberDecimal"
            android:id="@ id/editTextTA"
            android:maxWidth="150px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="25"
            android:gravity="right" />
        <TextView
            android:text="°"
            android:layout_columnWeight="1"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textView23"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
        <TextView
            android:layout_columnWeight="1"
            android:text="Tf:"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textViewTF"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:textAlignment="textEnd" />
        <EditText
            android:layout_columnWeight="1"
            android:inputType="numberDecimal"
            android:id="@ id/editTextTF"
            android:maxWidth="150px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="24"
            android:gravity="right" />
        <TextView
            android:text="°"
            android:layout_columnWeight="1"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textView25"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
        <TextView
            android:text="Tm:"
            android:layout_columnWeight="1"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textViewTM"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" 
            android:textAlignment="textEnd" />
        <EditText
            android:layout_columnWeight="1"
            android:inputType="numberDecimal"
            android:id="@ id/editTextTM"
            android:maxWidth="150px"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="5"
            android:gravity="right" />
        <TextView
            android:text="°"
            android:layout_columnWeight="1"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@ id/textView26"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
    </GridLayout>

    <RelativeLayout             
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@ id/relativeLayout2">
        <Spinner
            android:id="@ id/spinner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:prompt="@string/dawn_media_prompt"
            android:layout_centerVertical="true"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:gravity="center" />
    </RelativeLayout>

    <Button
        android:text="Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@ id/button1" />

    <GridLayout
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@ id/gridLayout3">
        <TextView
            android:text="Hello 1nHello 2nHello 3nHello 4nHello 5n"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@ id/textViewInfo"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:clickable="true" />
    </GridLayout>
    
</LinearLayout>
 

это создает интерфейс, показанный на прилагаемом изображении:

введите описание изображения здесь

Как вы можете видеть на XML, textViewInfo содержит около 5 строк текста, и элемент управления не помещается на экран. Это то, что я хочу получить.

В MainActivity.cs я попытался получить один элемент управления и суммировать высоту, но что-то не так.

 using Android.App;
using Android.OS;
using Android.Support.V7.App;
using Android.Runtime;
using Android.Widget;
using System;
using Xamarin.Essentials;
using Android.Views;
using Android.Graphics;

namespace abc_xamarin
{
    [Activity(Label = "@string/app_name", Theme = "@style/Theme.AppCompat", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        RadioButton radioButtonFT, radioButtonH2O;
        Spinner spinner;
        TextView textViewInfo;
        GridLayout gridLayout1, gridLayout2, gridLayout3;
        RelativeLayout relativeLayout1, relativeLayout2;
        Button button1;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);

            radioButtonFT = FindViewById<RadioButton>(Resource.Id.radioButtonFT);
            radioButtonH2O = FindViewById<RadioButton>(Resource.Id.radioButtonH2O);

            relativeLayout1 = FindViewById<RelativeLayout>(Resource.Id.relativeLayout1);
            relativeLayout2 = FindViewById<RelativeLayout>(Resource.Id.relativeLayout2);
            gridLayout1 = FindViewById<GridLayout>(Resource.Id.gridLayout1);
            gridLayout2 = FindViewById<GridLayout>(Resource.Id.gridLayout2);
            gridLayout3 = FindViewById<GridLayout>(Resource.Id.gridLayout3);

            spinner = FindViewById<Spinner>(Resource.Id.spinner);
            spinner.ItemSelected  = new EventHandler<AdapterView.ItemSelectedEventArgs>(spinner_ItemSelected);
            var adapter = ArrayAdapter.CreateFromResource(this, Resource.Array.dawn_media_array, Resource.Layout.custom_spinner_text);
            adapter.SetDropDownViewResource(Resource.Layout.custom_spinner_text);
            spinner.Adapter = adapter;

            radioButtonFT.CheckedChange  = (o, e) =>
            rdBtnFT();

            radioButtonH2O.CheckedChange  = (o, e) =>
            rdBtnH2O();

            textViewInfo = FindViewById<TextView>(Resource.Id.editTextTotFlour);

            button1 = FindViewById<Button>(Resource.Id.button1);
            
            button1.Click  = (o, e) =>
            btnBtn();
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

        private void rdBtnFT()
        {
            if (radioButtonFT.Checked == true)
            {
                radioButtonH2O.Checked = false;
                //do something
            }
        }

        private void rdBtnH2O()
        {
            if (radioButtonH2O.Checked == true)
            {
                radioButtonFT.Checked = false;
                //do something
            }
        }

        private void spinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
        {
            Spinner spinner = (Spinner)sender;
        }

        private void btnBtn()
        {
            //checkScreenContext();
            //gridLayout1, relativeLayout1, gridLayout2, relativeLayout2, button1, textViewInfo
            int sumY = 0;

            var location = new int[2];

            gridLayout1.GetLocationOnScreen(location);
            sumY = sumY   location[1];
            var sizeY = gridLayout1.Height;
            sumY = sumY   sizeY;

            //relativeLayout1.GetLocationOnScreen(location);
            sizeY = relativeLayout1.Height;
            sumY = sumY   sizeY;

            //gridLayout2.GetLocationOnScreen(location);
            sizeY = gridLayout2.Height;
            sumY = sumY   sizeY;

            //relativeLayout2.GetLocationOnScreen(location);
            sizeY = relativeLayout2.Height;
            sumY = sumY   sizeY;

            //button1.GetLocationOnScreen(location);           
            sizeY = button1.Height;
            sumY = sumY   sizeY;

            //textViewInfo.GetLocationOnScreen(location);
            sizeY = textViewInfo.Height;
            sumY = sumY   sizeY;

            string text = "Y: "   sumY.ToString();

            Toast.MakeText(this, text, ToastLength.Long).Show();
        }


    }
}
 

Я также пробовал другой способ получить позицию textViewInfo , но у меня позиция равна (0,0).

Я очень признателен, если кто-нибудь сможет исправить мой код. Спасибо!

Ответ №1:

Если вы хотите разместить все на экране, вы можете либо: использовать ScrollLayout, который позволит вам прокручивать вниз или вверх, если на вашем экране слишком много содержимого; или использовать ListLayout, который позволит вам прокручивать только список отображаемых элементов.

Наблюдая за изображением, я предполагаю, что потребуется комбинация из двух.

Комментарии:

1. Я постараюсь, спасибо Крисам! Это мое первое приложение для Xamarin-Android 🙂

Ответ №2:

Вызов getWidth , getHeight , getX , getY , и т.д. перед отображением компонента пользовательского интерфейса в интерфейсе обычно возвращается. 0

Вы могли бы позвонить View.post(Runnable) . Просматривая определение этого метода, мы можем видеть, что выполняемая операция выполняется между attachedToWindow() detachedFromWindow() точками представления, и позиция представления была вычислена в это время.

Например, вы хотите получить позицию textViewInfo :

 textViewInfo.Post(() =>
        {
            var location = new int[2];
            textViewInfo.GetLocationOnScreen(location);
            // you could get the position here
        }); 
 

Комментарии:

1. Кажется, это работает не так, как я ожидал, таким образом, я получаю, что location = 279, 240 для textViewInfo , но если я получаю позицию для gridLayout3.Post местоположения, выдает 0, 1213 . Итак, я попытался получить textViewInfo.Height , но ЕСЛИ TextView высота имеет одну строку или более, я всегда получаю одно и то же значение.

2. Кроме того, если я включаю textViewInfo.GetY() в textViewInfo.Post() метод, я все равно получаю 0 .

3. @orecchionebruno Во-первых, я обнаружил, что вы textViewInfo ссылаетесь на неправильный идентификатор ( textViewInfo = FindViewById<TextView>(Resource.Id.editTextTotFlour); ) , во-вторых, textViewInfo.GetY() он получит свою координату y в родительском контейнере, поэтому он получит 0 (вы можете установить mariginTop для проверки этого).