SpannableString в XamarinAndroid

У меня есть текстовое представление с 6 строками. Я хочу показать номер каждой строки с тостом, когда я нажимаю на каждую из них. Когда я использую Spans, он просто показывает номер последней строки. Как написать цикл для промежутков, чтобы вернуть все номера строк. Любые другие предложения? Спасибо за вашу помощь.

Мой код:

public class Activity1 : AppCompatActivity
{
    TextView textView;
    int count = 6; //Number of lines
    int next;
    string txt;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.activity_main);

        textView = FindViewById<TextView>(Resource.Id.textView1);
        txt = Resources.GetString(Resource.String.test);

        SpannableString ss = new SpannableString(txt);
        var clickableSpan = new MyClickableSpan();
        clickableSpan.Click += v => Toast.MakeText(this, "line : 1", ToastLength.Short).Show();
        ss.SetSpan(clickableSpan, 0, a, SpanTypes.ExclusiveExclusive);
        textView.TextFormatted = ss;
        textView.MovementMethod = new LinkMovementMethod();

        //For all lines
            //var clickableSpan1 = new MyClickableSpan();
            //var clickableSpan2 = new MyClickableSpan();
            //var clickableSpan3 = new MyClickableSpan();
            //var clickableSpan4 = new MyClickableSpan();
            //var clickableSpan5 = new MyClickableSpan();
       ...
    }
    private class MyClickableSpan : ClickableSpan
    {
        public Action<View> Click;

        public override void OnClick(View widget)
        {
            if (Click != null)
                Click(widget);
        }
        public override void UpdateDrawState(TextPaint textPaint)
        {
            textPaint.UnderlineText = false;
        }
    }
}

Мой код для цикла: From этот ответ

            for (int i = 0; i < ss.Length(); i = next)
            {
                // find the next span transition
                next = ss.NextSpanTransition(i, ss.Length(), Class.FromType(typeof(CharacterStyle)));
                // get all spans in this range
                int numOfSpans = 0;
                //CharacterStyle[] spans = ss.GetSpans(i, next, Class.FromType(typeof(CharacterStyle))); //return null!!!
                for (int j = 0; j < count; j++)
                {                        
                      numOfSpans++;
                }
                var clickableSpan = new MyClickableSpan();
                clickableSpan.Click += v => Toast.MakeText(this, "line : " + numOfSpans, ToastLength.Short).Show(); //return last number of lines : 6
                ss.SetSpan(clickableSpan, i, next, SpanTypes.ExclusiveExclusive);
                textView.TextFormatted = ss;
                textView.MovementMethod = new LinkMovementMethod();
            }

person Theeyn    schedule 05.12.2020    source источник
comment
Вы имеете в виду, что хотите получить положение текста textview, как на снимке экрана, который я привел в ссылке ниже? stackoverflow.com/a/62926729/11850033   -  person Wendy Zang - MSFT    schedule 08.12.2020


Ответы (1)


Я не уверен, чего вы хотите достичь, поэтому, пожалуйста, обновите описание :)

Из того, что я вижу, ошибка здесь textView.TextFormatted = ss;, когда вы устанавливаете равным ss, он переопределяет текст для текстового просмотра на каждом этапе цикла.

Я написал вам код, в котором textview имеет 6 диапазонов, и когда вы нажимаете на каждый из них, он показывает вам номер диапазона.

public class MainActivity : AppCompatActivity
    {
        TextView textView;
        int count = 6; //Number of lines
        string txt;
        List<string> spans;
        int startIndex = 0;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.activity_main);

            textView = FindViewById<TextView>(Resource.Id.textView1);
            txt = Resources.GetString(Resource.String.test);

            //Split your txt on the number of spans - count??
            spans = new List<string>()
            {
                "Span 1" + System.Environment.NewLine,
                "Span 2" + System.Environment.NewLine,
                "Span 3" + System.Environment.NewLine,
                "Span 4" + System.Environment.NewLine,
                "Span 5" + System.Environment.NewLine,
                "Span 6" + System.Environment.NewLine
            };

            SpannableStringBuilder spannableString = new SpannableStringBuilder();

            for (int i = 0; i < count; i++)
            {
                ISpannable wordtoSpan = new SpannableString(spans[i]);

                var clickableSpan = new MyClickableSpan(ShowToastForSpan, i);

                spannableString.Append(spans[i], clickableSpan, SpanTypes.ExclusiveExclusive);
            }

            textView.TextFormatted = spannableString;

            textView.MovementMethod = LinkMovementMethod.Instance;
        }

        private void ShowToastForSpan(int spanNumber)
        {
            Toast.MakeText(this, $"Span number {spanNumber + 1} was clicked", ToastLength.Long).Show();
        }
    }

    class MyClickableSpan : ClickableSpan
    {
        private Action<int> _onSpanClicked;
        private int _spanNumber;
        Random rnd = new Random();

        public MyClickableSpan(Action<int> onSpanClicked, int spanNumber)
        {
            _onSpanClicked = onSpanClicked;
            _spanNumber = spanNumber;
        }

        public override void OnClick(View widget)
        {
            _onSpanClicked.Invoke(_spanNumber);
        }

        public override void UpdateDrawState(TextPaint textPaint)
        {
            textPaint.Color = Color.Argb(255, rnd.Next(256), rnd.Next(256), rnd.Next(256));
            textPaint.UnderlineText = false;
        }
    }
person Stefanija    schedule 06.12.2020
comment
Большое спасибо .. Если я расширю строку span1, например span 1 span 1 span 1 span 1span 1 и настрою шрифт textView на 60sp, у меня будет 4 строки в textView, и, щелкнув каждую строку, он вернет один и тот же номер. Моя текстовая строка включает в себя короткий рассказ, который, изменив шрифт, также должен изменить количество строк... - person Theeyn; 06.12.2020