2015-06-19 19 views
13

sonra eski konumunu döndürürgetLocationOnScreen Ben ne dönüş

Görünümün ekranında yer almak için ViewA.getLocationOnScreen kullanıyorum. Diyaloğu ilk açtığımda pozisyon doğru. Ekranı döndürdüğümde, android:configChanges yüzünden, görünüm bir şekilde konumunu güncelleyemiyor ve iletişim kutusunun etkin bir şekilde ortalanmış olmasına rağmen ViewA'nın getLocationOnScreen'i döndürmeden önce daha eski konuma işaret ediyor.

Denediğim şey.

Ben diyalog onConfigurationChanged overrode ve bu çalıştı:

  • ViewA.requestLayout (bir şey yapmaz)
  • ViewA.getViewTreeObserver().addOnGlobalLayoutListener ve onGlobalLayout 1'e TOPMARGIN ayarlayın ve yeniden requestLayout çağrı üzerine
  • . (Bu çalıştı ama Marjı ben ekrana döndürmek her zaman ayarlamak istemiyorum)

Bilmek istiyorum ben getLocationOnScreen bir sonra doğru değerleri döndürür hale diyalog repozisyonunu zorlayabilirsiniz nasıl onConfigurationChanged çağrıldığında ekranda android:configChanges

+0

diyoruz? Özellikle _when_ ile ilgili kod 'getLocationOnScreen' kontrol ediyorsunuz. [Bu] (http: // stackoverflow.com/questions/13243914/getlocationonscreen-in-oncreate-just-returns-zeroes) sizinki sorun değil ama benzer bir sebebi varsa merak ediyorum. – mpkuth

+0

Hayır, o böyle değil. Görünüm zaten çizilmiş ve doğru şekilde yerleştirilmiş. Sorun, etkinlik rekreasyonunu devre dışı bırakan 'android: configChanges' ile ilgilidir. Bu durumda, etkinlik yok olmadığından, iletişim kutusu da yok olmaz. İşte bu yüzden görüşün konumu eskisi gibi duruyor. Bu çoğaltılması kolay olduğundan kod gerekmez. –

cevap

-1

görünümün konumunu değiştirmek istemiyorum rotasyon

Not henüz güncellenmedi. Aradığınız güncellemeleri yakalamak için görünüme bir OnLayoutChangeListener eklemeniz gerekir. Aşağıdaki örneğe bakınız.

TestDialogFragment.java

public class TestDialogFragment extends DialogFragment { 

    private static final String TAG = "TestDialogFragment"; 

    View testView; 
    int[] testViewLocation = {0, 0}; 

    public TestDialogFragment() {} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.test_fragment, container); 
     testView = view.findViewById(R.id.test_view); 
     testView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
      @Override 
      public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
       Log.d(TAG, "onLayoutChange"); 
       testView.getLocationOnScreen(testViewLocation); 
       Log.d(TAG, String.format("%s %s", testViewLocation[0], testViewLocation[1])); 
      } 
     }); 
     return view; 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     Log.d(TAG, "onConfigurationChanged"); 
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
      Log.d(TAG, "landscape"); 
     } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
      Log.d(TAG, "portrait"); 
     } 

     testView.getLocationOnScreen(testViewLocation); 
     Log.d(TAG, String.format("%s %s", testViewLocation[0], testViewLocation[1])); 
    } 

} 

test_fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <View 
     android:id="@+id/test_view" 
     android:layout_height="50dp" 
     android:layout_width="match_parent" 
     android:layout_gravity="center"/> 

</FrameLayout> 

Günlüğü Çıktı

06-24 16:20:05.682 D/TestDialogFragment﹕ onConfigurationChanged 
06-24 16:20:05.682 D/TestDialogFragment﹕ portrait 
06-24 16:20:05.682 D/TestDialogFragment﹕ 504 601 
06-24 16:20:05.852 D/TestDialogFragment﹕ onLayoutChange 
06-24 16:20:05.852 D/TestDialogFragment﹕ 84 1021 
06-24 16:20:08.695 D/TestDialogFragment﹕ onConfigurationChanged 
06-24 16:20:08.695 D/TestDialogFragment﹕ landscape 
06-24 16:20:08.695 D/TestDialogFragment﹕ 84 1021 
06-24 16:20:08.865 D/TestDialogFragment﹕ onLayoutChange 
06-24 16:20:08.865 D/TestDialogFragment﹕ 504 601 
06-24 16:20:13.550 D/TestDialogFragment﹕ onConfigurationChanged 
06-24 16:20:13.550 D/TestDialogFragment﹕ portrait 
06-24 16:20:13.550 D/TestDialogFragment﹕ 504 601 
+0

Küresel bir düzen dinleyicisinin neye benzediğini hatırlattığınız için teşekkür ederim ama size söylediğim gibi bu sorunu çözmüyor. Soruyu okudun mu? "Neyi denediğimi" kontrol edin 2 –

+0

Ayrıca, tüm bu değer için view konumunu boşaltmak için onClickListener kullanıyorum. görünüm zaten çizilir ve ben konumunu –

+0

aldığımda hazır Soruyu okuyup "ne denedim" içinde numara 2 Eğer bir küresel düzen dinleyici denemiş kaydetti ve bunu zorunda kaldılar dışında çalıştığını söyledi Her zaman bir kenar boşluğu belirledikten sonra istek düzenini tekrar arayın. Cevabım global düzen dinleyicisini kullanıyor ancak marjı sıfırlamanıza ve ek bir düzen talep etmenize gerek yok. – mpkuth

0

Eğer View s anlamına gerçekleşecek Activity hiçbir rekreasyon, ölçülemez olacak bu android:configChanges="orientation varsa, anlatmaya çalışacağım için, o eski pozisyonları bildirilmektedir neden ayrıca View İhtiyacınız o çağrı üzerine tam bir beraberlik talebinde bulunmak DialogFrament 'ın Görünüm ebeveyn üzerinde genel oyun sizin DecorView için çok - Eğer kod bazılarını yapabiliyor musunuz invalidate() & requestLayout()

+0

geçersiz ve talep düzeni ile aynıdır. Cevabın geri kalanı için gelince. Evet bunu zaten biliyordum ve zaten sorunun yorum bölümünde de söyledim. –