5

Jestem wykonawczych próbnika czasu, który wygląda tak:Android Widok niestandardowy przenieść z powrotem do pierwotnego położenia podczas odświeżania

unfinished time picker

To żółty blok jest MyCustomView. Podczas przenoszenia MyCustomView powinienem obliczyć nową datę i ustawić tvDate.

częściowy plik układ:

<LinearLayout 
    android:orientation="vertical"> 

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

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

     <MyCustomView 
     android:layout_centerInParent="true"/> 

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

Kod:

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 
    } 
} 

Jeśli tvDate.setText() jest usuwany, MyCustomView następująco palec, na przykład:

enter image description here

Jeśli zaktualizować tvDateMyCustomView wraca do centrum rl:

enter image description here

I nie sądzę, że problem zadaniowego cyklem życia. Ktoś wspomniał o ((MarginLayoutParams)rl.getLayoutParams()).topMargin, ale nie wyjaśnił dlaczego.
Ktoś może mi pomóc?

+0

powinny być bardziej szczegółowe. Co masz na myśli przez "swoją oryginalną pozycję"? –

+1

Pokaż również pełny kod działania. Może to być kwestia cyklu życia aktywności –

+0

@FarhadFaghihi Mam edytować moje pytanie. 'MainActivity' zawiera' onCreate' i wywołanie zwrotne. Nie uważam tego za problem związany z cyklem życia aktywności. –

Odpowiedz

0

Musisz zapisać lokalizację swojego widoku i wyrenderować ją w tym samym miejscu, gdy aktywność zostanie wznowiona (wracając z domu) lub uruchomiona (wraca po ponownym naciśnięciu). This Picture przedstawia metody można przesłonić aby osiągnąć takie jak OnPause kiedy traci ostrość itd

EDIT

Od spojrzeń tego, to jest resetowanie powrót do stanu pierwotnego. Opublikuj więcej informacji o tym, jak ustawiasz lokalizację itp. Jeśli jest to widok, w którym się poruszasz. Następnie zaimplementuj on drag listener zamiast tej aktualizacji. I daj mi znać, jak to działa.

+0

Mam edytować moje pytanie. @ Zaid Qureshi –

+0

Właśnie dokonałem edycji w mojej odpowiedzi –

+0

Ustawiam lokalizację przez 'v.layout (lewy, górny, prawy, dolny)' w 'MyCustomView.onTouch (View v, MotionEvent motionEvent)' –

1

Twoje rozwiązanie jest invalidate swój CustomView po TextView.setText() setText() zanim układ lub przechodzą w wartościach na lewej stronie, 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() 

Dlaczego? TextView.setText() wyzwala invalidate & requestLayout() w tym samym czasie, aby wymusić szybki układ, ale Invalidate() po prostu mówi rodzicowi, że jest brudny, więc musi wykonać odgórny układ przejścia.

(jestem zdezorientowany, więc nie będę go kontynuował, dlatego skaczę). Twój TextView jest wewnątrz układu nadrzędnego, który grand dziecko jest niestandardowy widok, a invalidate(), re-lays wszyscy stąd wysyła swój własny widok z powrotem na swoim miejscu, jednak jeśli wykluczyć, że i wywołać wyraźne invalidate() w niestandardowym go zobaczyć mówi rodzicowi, że jego brudny i taki sam proces się dzieje, ale tym razem tylko z użytkownikiem: Zaid Qureshi, już o tym poinformowałeś, za pomocą użytkownika: Zaid Qureśi.

Również nie wiem, czy wiesz, że layoutParams przypisany do twojego customView pochodzi od rodzica, którego nie kontrolujesz dużo, ale os, a iniekcje Params są tym, czego używasz do układu i dają dopełnienie itp. Twój widok, a ponieważ nie układasz ich, ale po prostu mijasz pozycje.

nadzieję, że sens ty & pomaga