#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 для проверки этого).