Android рассматривает тейт изменения сбрасывает макет

У меня есть список со Swipe Actions, использующий IOnTouchListener, так как при перетаскивании я меняю левую часть LinearLayout, чтобы отобразить второй LinearLayout позади него. Этот макет имеет две кнопки, одна скрыта. Если пользователь делает "быстрый" пролистывание, то я перемещаю левый вид сверху на определенное значение и запускаю некоторый код. Этот код изменяет невидимую кнопку, чтобы быть видимой. Когда ViewState этой кнопки изменится, левый вид сверху вернется к 0 вместо того, чтобы оставаться там, где я его разместил. Любая идея, почему он это сделал или как обойти это.

XML выглядит так... (но немного изменится в зависимости от ответа на другой вопрос, который я разместил)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="fill_vertical"
    android:background="@color/black"
    android:id="@+id/Swipe"
  >
  <LinearLayout
    android:id="@+id/LeftContentView"
    android:layout_width="175dp"
    android:layout_height="match_parent"
    android:background="@color/yellow"
    android:layout_alignParentLeft="true"
    android:orientation="horizontal"
    >
    <Button 
      android:id="@+id/ApproveButton"
      android:layout_width="0dp"
      android:layout_weight=".72"
      android:layout_height="match_parent"
      android:background="#2796C3"
      android:text="Approve"
      android:layout_alignParentLeft="true"
      />
      <Button 
      android:id="@+id/ApproveUndoButton"
      android:layout_width="0dp"
      android:layout_weight=".28"
      android:layout_height="match_parent"
      android:background="#215681"
      android:text="Undo"
      android:layout_toRightOf="@id/ApproveButton"
      />
  </LinearLayout>

  <LinearLayout
  android:layout_alignParentRight="true"
  android:id="@+id/RightContentView"
  android:layout_width="175dp"
  android:layout_height="match_parent"
  android:background="@color/black"
  android:orientation="horizontal"
    >
    <Button
      android:id="@+id/DenyButton"
      android:layout_width="0dp"
      android:layout_weight=".72"
      android:layout_height="match_parent"
      android:background="#FF0000"
      android:text="Deny"
      />
    <Button
      android:id="@+id/DenyUndoButton"
      android:layout_width="0dp"
      android:layout_weight=".28"
      android:layout_height="match_parent"
      android:background="#860000"
      android:text="Undo"
      />
  </LinearLayout>

  <LinearLayout
    android:id="@+id/TopContentView"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#1F1F1F">
    <LinearLayout
      android:layout_height="fill_parent"
      android:layout_width="match_parent" >
      <ImageView 
        android:id="@+id/UnreadImage"
        android:layout_height="match_parent" 
        android:layout_width="7dp" 
        android:src="@drawable/vertical_blue_bar"
        android:background="#2796C3"/>  
      <LinearLayout
        android:id="@+id/ListText"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="10dip"
        android:padding="12dp">
        <TextView
             android:id="@+id/Text_Line1"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textColor="@color/white"
             android:textSize="13dip"
             />
        <TextView
               android:id="@+id/Text_Line2"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:textColor="@color/white"
               android:textSize="13dip"
             />
        <TextView
             android:id="@+id/Text_Line3"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textColor="@color/white"
             android:textSize="11dip"
             />
      </LinearLayout>
    </LinearLayout>
  </LinearLayout>
</RelativeLayout>

Я не использую Java, я использую Xamarin с C#. Вот соответствующие фрагменты кода...

    public bool OnTouch(View v, MotionEvent e)
    {

        switch (e.Action)
        {
             case MotionEventActions.Down:
                  OriginalTouchX = Math.Ceiling(e.RawX);
                  index = e.ActionIndex;
                  pointerId = e.GetPointerId(index);
                  VelocityTracker.AddMovement(e);
                  break;

             case case MotionEventActions.Move:
                  VelocityTracker.AddMovement(e);
                 ChangeX(newX);
                  VelocityTracker.ComputeCurrentVelocity(1);

                  float velocity = Math.Abs(VelocityTracker.GetXVelocity(pointerId));

                  if (velocity > SlowDrag && Math.Abs(distanceMoved) > (DragThreshold / 3))
                  {
                       QuickApprove();
                  }
                  break;
        }
    }



void QuickApprove()
    {
            ToggleUndoButton(true, true);
            WaitingForUndo = true;
            ChangeX(DragThreshold);
            this.ApproveTimer.Start(true);
    }

    private void ToggleUndoButton(bool ShowUndo, bool LeftSide)
    {
                this.ApproveUndoButton.Visibility = ViewStates.Visible;
                this.ApproveButton.Text = "Approving...";
    }

    private void ChangeX(int newX)
    {
        int width = this.TopContentView.Right - this.TopContentView.Left;
        this.TopContentView.Left = newX;
        this.TopContentView.Right = this.TopContentView.Left + width;
    }

Если в методе ToggleUndoButton я закомментирую строку

this.ApproveUndoButton.Visibility = ViewStates.Visible;

Все отлично работает Слева от TopContentView изменяется, чтобы быть равным моему DragThreshold, текст меняется на Утверждение... таймер запускается, он остается таким в течение 2 секунд, затем код в моем тик таймера срабатывает и TopContentView перемещается обратно влево 0. Если я оставляю изменения видимости, то TopContentView немедленно возвращается к 0 вместо ожидания, пока таймер не завершится.

0 ответов

Другие вопросы по тегам