using System;
|
using System.Collections.Generic;
|
using System.Text;
|
|
namespace Shared.Phone
|
{
|
/// <summary>
|
/// 输入框控件的最初原型(不建议修改和直接使用):标准字体颜色,文字向左靠齐,14号字
|
/// </summary>
|
public class TextInputBase : EditText
|
{
|
#region ■ 变量声明___________________________
|
|
/// <summary>
|
/// 联动底线
|
/// </summary>
|
private NormalViewControl btnLineTemp = null;
|
/// <summary>
|
/// 联动底线(光标进来之后,线的颜色会变)
|
/// </summary>
|
public NormalViewControl btnLine
|
{
|
set
|
{
|
this.btnLineTemp = value;
|
}
|
}
|
/// <summary>
|
/// 联动外框
|
/// </summary>
|
private NormalFrameLayout frameBorder = null;
|
/// <summary>
|
/// 联动外框(光标进来之后,外框的颜色会变)
|
/// </summary>
|
public NormalFrameLayout FrameBorder
|
{
|
set
|
{
|
this.frameBorder = value;
|
}
|
}
|
|
/// <summary>
|
/// 输入结束的事件
|
/// </summary>
|
public Action FinishInputEvent = null;
|
/// <summary>
|
/// 值改变事件(受MaxByte属性限制)
|
/// </summary>
|
public Action<string> TextChangedEvent = null;
|
/// <summary>
|
/// 指定该输入框是否为不可省略(默认为false)
|
/// </summary>
|
public bool MustInput = false;
|
|
private int m_MaxByte = -1;
|
/// <summary>
|
/// 最大输入Byte长度
|
/// </summary>
|
public int MaxByte
|
{
|
get { return m_MaxByte; }
|
set
|
{
|
m_MaxByte = value;
|
this.TextChangeEventHandler -= this.TxtCode_TextChangedEvent;
|
if (m_MaxByte > 0)
|
{
|
this.TextChangeEventHandler += this.TxtCode_TextChangedEvent;
|
}
|
}
|
}
|
|
private bool m_UseFocusColor = false;
|
/// <summary>
|
/// 光标进入文本框时,是否让字体颜色变更(默认不使用)
|
/// </summary>
|
public bool UseFocusColor
|
{
|
set
|
{
|
m_UseFocusColor = value;
|
if (m_UseFocusColor == true)
|
{
|
//灰色字体
|
this.TextColor = UserCenterColor.Current.TextGrayColor3;
|
}
|
}
|
}
|
|
private bool m_OnError = false;
|
/// <summary>
|
/// 让这个文本框显示处于错误的特效
|
/// </summary>
|
public bool OnError
|
{
|
get { return m_OnError; }
|
set
|
{
|
if (value != m_OnError)
|
{
|
m_OnError = value;
|
//暂时屏蔽此特效
|
//if (m_OnError == true)
|
//{
|
// //红色
|
// this.BorderColor = UserCenterColor.Current.Red;
|
// this.Radius = (uint)Application.GetRealHeight(17);
|
// this.BorderWidth = 3;
|
//}
|
//else
|
//{
|
// this.BorderColor = UserCenterColor.Current.Transparent;
|
// this.BorderWidth = 0;
|
// this.Radius = 0;
|
//}
|
}
|
}
|
}
|
|
#endregion
|
|
#region ■ 初始化_____________________________
|
|
/// <summary>
|
/// 输入框控件的最初原型(不建议修改和直接使用):标准字体颜色,文字向左靠齐,14号字
|
/// </summary>
|
public TextInputBase()
|
{
|
//测试,全体输入框为14号字
|
this.TextSize = 14;
|
|
this.PlaceholderTextColor = UserCenterColor.Current.TextTipColor;
|
this.TextColor = UserCenterColor.Current.TextColor1;
|
this.TextAlignment = TextAlignment.CenterLeft;
|
|
//焦点事件
|
this.FoucsChanged += this.TxtCode_FoucsChangedEvent;
|
//按下回车键事件
|
this.EditorEnterAction += this.EditorEnterEvent;
|
}
|
|
/// <summary>
|
/// 初始化控件大小(不以平均值进行真实数值计算)
|
/// </summary>
|
/// <param name="i_Width">宽度</param>
|
/// <param name="i_Height">高度</param>
|
/// <param name="real">是否计算真实值</param>
|
public void InitSize(int i_Width, int i_Height, bool real = true)
|
{
|
if (real == true)
|
{
|
i_Width = Application.GetRealWidth(i_Width);
|
i_Height = Application.GetRealHeight(i_Height);
|
}
|
|
this.Height = i_Height;
|
this.Width = i_Width;
|
}
|
|
/// <summary>
|
/// 初始化控件大小(不以平均值进行真实数值计算)
|
/// </summary>
|
/// <param name="i_Width">宽度</param>
|
/// <param name="real">是否计算真实值</param>
|
public void InitSize(int i_Width, bool real = true)
|
{
|
if (real == true)
|
{
|
i_Width = Application.GetRealWidth(i_Width);
|
}
|
|
this.Height = HdlControlResourse.NormalControlHeight;
|
this.Width = i_Width;
|
}
|
|
/// <summary>
|
/// 初始化控件大小(以平均值进行真实数值计算)
|
/// </summary>
|
/// <param name="i_Width">宽度</param>
|
/// <param name="i_Height">高度</param>
|
/// <param name="real">是否计算真实值</param>
|
public void InitAvgSize(int i_Width, int i_Height, bool real = true)
|
{
|
if (real == true)
|
{
|
i_Width = this.GetPictrueRealSize(i_Width);
|
i_Height = this.GetPictrueRealSize(i_Height);
|
}
|
|
this.Height = i_Height;
|
this.Width = i_Width;
|
}
|
|
#endregion
|
|
#region ■ 事件_______________________________
|
|
/// <summary>
|
/// 焦点变更事件
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
private void TxtCode_FoucsChangedEvent(object sender, FocusEventArgs e)
|
{
|
if (e.Focus == false)
|
{
|
if (btnLineTemp != null)
|
{
|
btnLineTemp.BackgroundColor = UserCenterColor.Current.ButtomLine;
|
}
|
if (frameBorder != null)
|
{
|
frameBorder.BorderColor = 0xffcccccc;
|
}
|
if (m_UseFocusColor == true)
|
{
|
//灰色字体
|
this.TextColor = UserCenterColor.Current.TextGrayColor3;
|
}
|
}
|
else
|
{
|
if (btnLineTemp != null)
|
{
|
btnLineTemp.BackgroundColor = UserCenterColor.Current.TextFrameSelectColor;
|
}
|
if (frameBorder != null)
|
{
|
frameBorder.BorderColor = UserCenterColor.Current.TextFrameSelectColor;
|
}
|
if (m_UseFocusColor == true)
|
{
|
//正常字体
|
this.TextColor = UserCenterColor.Current.TextColor1;
|
}
|
}
|
}
|
|
/// <summary>
|
/// 输入完成事件
|
/// </summary>
|
/// <param name="view"></param>
|
private void EditorEnterEvent(View view)
|
{
|
//检测最大输出Byte
|
string msg = this.CheckMaxByte();
|
if (msg != null)
|
{
|
var contr = new ShowMsgControl(ShowMsgType.Tip, msg);
|
contr.Show();
|
return;
|
}
|
this.FinishInputEvent?.Invoke();
|
}
|
|
/// <summary>
|
/// 值改变事件
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="value"></param>
|
private void TxtCode_TextChangedEvent(object sender, string value)
|
{
|
var byteData = Encoding.UTF8.GetBytes(value);
|
var newValue = value;
|
|
//如果输入的值,已经大于指定的byte数,则截取
|
if (byteData.Length > this.m_MaxByte)
|
{
|
//截取指定的byte字节
|
newValue = Encoding.UTF8.GetString(byteData, 0, this.m_MaxByte);
|
//最后一位不要,因为截取的最后一位可能是乱码
|
newValue = newValue.Substring(0, newValue.Length - 1);
|
//拼接上它的下一位,然后检测
|
var checkValue = newValue + value[newValue.Length];
|
if (Encoding.UTF8.GetBytes(checkValue).Length <= this.m_MaxByte)
|
{
|
//正好匹配byte数
|
newValue = checkValue;
|
}
|
this.Text = newValue;
|
//将光标至于最后
|
#if Android
|
this.SetSelectionEnd();
|
#endif
|
}
|
this.TextChangedEvent?.Invoke(newValue);
|
}
|
|
#endregion
|
|
#region ■ 检测错误___________________________
|
|
/// <summary>
|
/// 检测正确性,存在错误时,返回错误文本,无错误返回null
|
/// </summary>
|
/// <returns></returns>
|
public string CheckError()
|
{
|
//执行检测错误
|
string error = this.DoCheckError();
|
if (error != null)
|
{
|
//焦点控制
|
this.Foucs = true;
|
return error;
|
}
|
return null;
|
}
|
|
/// <summary>
|
/// 执行检测错误
|
/// </summary>
|
/// <returns></returns>
|
private string DoCheckError()
|
{
|
//检测最大输出Byte
|
string msg = this.CheckMaxByte();
|
if (msg != null) { return msg; }
|
|
//检测必须输入
|
if (this.MustInput == true && this.Text.Trim() == string.Empty)
|
{
|
if (string.IsNullOrEmpty(this.PlaceholderText) == false)
|
{
|
return this.PlaceholderText;
|
}
|
//该内容不能省略
|
return Language.StringByID(R.MyInternationalizationString.uThisContentCanNotOmitted);
|
}
|
|
return null;
|
}
|
|
/// <summary>
|
/// 检测最大输入byte
|
/// </summary>
|
/// <returns></returns>
|
private string CheckMaxByte()
|
{
|
return null;
|
}
|
|
#endregion
|
|
#region ■ 一般方法___________________________
|
|
/// <summary>
|
/// 计算图片的真实高宽度
|
/// </summary>
|
/// <param name="i_size"></param>
|
/// <returns></returns>
|
public int GetPictrueRealSize(int i_size)
|
{
|
return HdlControlLogic.Current.GetPictrueRealSize(i_size);
|
}
|
|
/// <summary>
|
/// 控件移除
|
/// </summary>
|
public override void RemoveFromParent()
|
{
|
this.FinishInputEvent = null;
|
this.TextChangedEvent = null;
|
if (this.Parent != null)
|
{
|
base.RemoveFromParent();
|
}
|
}
|
|
#endregion
|
}
|
}
|