繁体   English   中英

刷新时,Android自定义视图会移回原始位置

[英]Android Custom View move back to original position when refreshing

我正在实现一个时间选择器,如下所示:

未完成的时间选择器

黄色块是MyCustomView 移动MyCustomView ,我应该计算新日期并设置tvDate

部分布局文件:

<LinearLayout 
    android:orientation="vertical">

    <TextView android:id="@+id/tv_date">

    <RelativeLayout 
        android:id="@+id/rl">

        <MyCustomView
         android:layout_centerInParent="true"/>

        <OtherViews/>
    </RelativeLayout>
</LinearLayout>

码:

class MyCustomView extends View{

    // move listener
    public interface IMoveCallback{
        void update(int index);
    }

    private IMoveCallback listener = null; 

    // set listener
    public void setMoveCallback(IMoveCallback callback){
        this.listener = callback;
    }

    @Override
    protected void onDraw(Canvas c){
        super.onDraw(c);
        // draw yellow block and four arrows here.
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        processDrag(v, event);
        invalidate();
        return false;
    }

    private void processDrag(View v, MotionEvent event){
        // calculate new position(left, top, right, bottom)
        v.layout(newLeft, newTop, newRight, newBottom); 
        if(listener != null){
            // calculate index by new position
            listener.update(index);
        }
    }
}

class MainActivity extends Activity implements MyCustomView.IMoveCallback{

    MyCustomView view; // view.setMoveCallback(MainActivity.this)

    @Override
    public void update(int index){
        tvDate.setText(String.valueOf(System.currentTimeMillis()))//update tvDate
    }
}

如果删除了tvDate.setText()MyCustomView跟随手指,如下所示:

在此输入图像描述

如果我更新tvDateMyCustomView会移回到rl的中心:

在此输入图像描述

我不认为这是一个活动 - 生命周期问题。 有人提到过((MarginLayoutParams)rl.getLayoutParams()).topMargin但没有解释原因。
有人可以帮帮我吗?

你的解决方案是在布局之前 TextView.setText() setText() 之后 invalidate你的 CustomView invalidate 或者为你的左边,rigth传递值...

private void processDrag(View v, MotionEvent event){       
    if(listener != null){
        // calculate index by new position
        listener.update(index);
    }        
    // calculate new position(left, top, right, bottom)
    v.layout(newLeft, newTop, newRight, newBottom); 
}
//i think you should take out invalidate() in your onTouch()

为什么? TextView.setText()触发invalidaterequestLayout()以强制快速布局,但Invalidate()只是告诉其父级它是脏的,所以它需要做一个自上而下的布局传递。

我很困惑,所以我不会继续支持这个,因此我跳了 )。 您的TextView位于父级布局中,其子孙是您的自定义视图,而invalidate() ,重新放置所有这些,因此将您的自定义视图发送回其位置,但是如果您排除它,并调用显式的invalidate() in它的自定义视图告诉它父进程它的脏和相同的进程发生,但这次只有RelativeLayout

用户:Zaid Qureshi已经知道了这一点。

另外我不知道你是否知道给你的customView提供的layoutParams来自你不能控制很多但是操作系统的父系,并且注入的Params用于布局和给你的视图等填充等等,以及因为你没有把它们排好,而只是通过位置。

希望我对你有意义并且有所帮助

您需要保存视图的位置,并在活动恢复(从家中回来)或开始(在按下后返回)时将其呈现在同一位置。 此图片显示了您可以覆盖以实现该方法的方法,例如失去焦点时的onPause等。

编辑

从它的外观来看,它正在重置回原始状态。 发布更多关于如何设置位置的信息等。如果这是一个你正在移动的视图。 然后实现一个on drag listener而不是该更新。 让我知道这是如何工作的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM