Xamarin.Androidの[テキストの編集]クリックまたはフォーカスイベントで日付ピッカーポップアップを表示するにはどうすればよいですか?
Xamarin.Formsに対して次のようなものを試してください:
public class SamplePage : ContentPage
{
public SamplePage ()
{
var editText = new Entry {
Placeholder = "Select Date.",
};
var date = new DatePicker {
IsVisible = false,
IsEnabled = false,
};
var stack = new StackLayout {
Orientation = StackOrientation.Vertical,
Children = {editText, date}
};
editText.Focused += (sender, e) => {
date.Focus();
};
date.DateSelected += (sender, e) => {
editText.Text = date.Date.ToString();
};
Content = stack;
}
}
編集:
Xamarin.Androidで次のようなものを試してください:
MyLayout.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:id="@+id/editText" />
</LinearLayout>
MyLayoutActivity.cs
using System;
using Android.App;
using Android.OS;
using Android.Widget;
namespace AndiNative
{
[Activity (Label = "MyLayoutActivity", MainLauncher = true)]
public class MyLayoutActivity: Activity
{
private static EditText editText;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView (Resource.Layout.DatePickerTest);
editText = FindViewById<EditText> (Resource.Id.editText);
editText.Click += (sender, e) => {
DateTime today = DateTime.Today;
DatePickerDialog dialog = new DatePickerDialog(this, OnDateSet, today.Year, today.Month - 1, today.Day);
dialog.DatePicker.MinDate = today.Millisecond;
dialog.Show();
};
}
void OnDateSet(object sender, DatePickerDialog.DateSetEventArgs e)
{
editText.Text = e.Date.ToLongDateString();
}
}
}
MVVMが好きな人のために。これは、XamarinFormsでのMVVMの実装です。ここでは、イベントからコマンドへの動作を使用しました。このリンクから詳細を確認できます Xamarinイベントからコマンドの動作
Xaml
<Entry Text="{Binding DateOfBirth, Mode=TwoWay}" />
<Image Source="button.png" WidthRequest="39">
<Image.GestureRecognizers>
<TapGestureRecognizer Command="{Binding OnSelectDOBCommand}" CommandParameter="{Binding ., Source={Reference DOBPicker}}" />
</Image.GestureRecognizers>
</Image>
<DatePicker x:Name="DOBPicker"
Date="{Binding SelectedDOB}"
IsEnabled="True"
IsVisible="False">
<DatePicker.Behaviors>
<behaviors:DatePickerSelectedBehavior Command="{Binding DateSelectedCommand}" EventName="DateSelected" />
</DatePicker.Behaviors>
</DatePicker>
モデルコードの表示
OnSelectDOBCommand = new RelayCommand<DatePicker>(FocusDatePicker);
DateSelectedCommand = new RelayCommand(SetDateOfBirth);
今度は関数定義
private void FocusDatePicker(DatePicker obj)
{
obj.Focus();
}
private void SetDateOfBirth()
{
DateOfBirth = SelectedDOB;
}
これが誰かを助けることを願っています
2016年11月11日更新
もう1つの方法は、 ACR.Userdialogs シンプルでわかりやすい方法を使用することです。 ICommandを宣言します
OnSelectDOBCommand = new RelayCommand(ShowDatePicker);
次に、関数ShowDatePickerを定義します
private void ShowDatePicker()
{
UserDialogs.Instance.DatePrompt(new DatePromptConfig { MaximumDate = MaxDate, OnAction = (result) => SetDateOfBirth(result), IsCancellable = true });
}
そして、設定された生年月日機能
private void SetDateOfBirth(DatePromptResult result)
{
if(result.Ok)
{
DateOfBirth = result.SelectedDate.ToString("dd MMM yyyy");
}
}
最良の部分は、特別なXamlをまったく必要としないことです。どのボタンにも引っ掛けることができます。
アランは賞か何かを与えられるべきです
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginLeft="10dp"
Android:layout_marginRight="10dp"
Android:layout_marginBottom="15dp"
Android:id="@+id/datePickerText"
Android:textColor="@color/textColor"
Android:textColorHint="@color/textColor"
Android:textSize="14dp"
local:MvxBind="Value Format('{0:dd MMM yyyy}',Date)" />
viewmodelのプロパティ-
private DateTime _date = DateTime.Today;
public DateTime Date
{
get
{
return _date;
}
set
{
_date = value;
RaisePropertyChanged(() => Date);
}
}
私のクラスの中-
private EditText datePickerText;
private DatePickerDialogFragment dialog;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.report);
var dp = new MvxDatePicker(this);
dp.SpinnersShown = true;
dp.DateTime = DateTime.Now;
datePickerText.Focusable = false;
datePickerText.Text = ViewModel.Date.ToString("dd-MMM-yyyy");
datePickerText.Click += (sender, args) =>
{
if(datePickerText.Text == "")
dialog = new DatePickerDialogFragment(this, DateTime.Now,this);
else
dialog = new DatePickerDialogFragment(this,Convert.ToDateTime(datePickerText.Text), this);
dialog.Show(this.SupportFragmentManager, "date");
};
datePickerText.TextChanged += (sender, args) =>
{
ViewModel.Date = Convert.ToDateTime(datePickerText.Text);
};
}
public void OnDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
{
datePickerText.Text = new DateTime(year, monthOfYear + 1, dayOfMonth).ToString("dd-MMM-yyyy");
}
ここでは、今日のデフォルトの日付を使用するか、ユーザーが選択した日付に変更します