Döndürmeyi İşleme

Bu konuda, Xamarin. Android dosyasındaki cihaz yönü değişikliklerinin nasıl işleneceği açıklanır. Belirli bir cihaz yönlendirmesine yönelik kaynakları otomatik olarak yüklemek ve yönlendirme değişikliklerinin programlı olarak işlenmesi için Android kaynak sistemiyle çalışmayı ele alır.

Genel Bakış

Mobil cihazlar kolayca döndürülbildiğinden, yerleşik döndürme, mobil OSE 'deki standart bir özelliktir. Android, uygulamalar içinde, Kullanıcı arabiriminin XML 'de veya kodda program aracılığıyla oluşturulup oluşturulmayacağı gibi gelişmiş bir çerçeve sağlar. Döndürülen bir cihazda bildirime dayalı düzen değişikliklerinin otomatik olarak işlenmesi sırasında bir uygulama, Android kaynak sistemiyle sıkı tümleştirmeden faydalanabilir. Programlı düzen için değişikliklerin el ile işlenmesi gerekir. Bu, çalışma zamanında daha iyi denetime izin verir, ancak geliştirici için daha fazla çalışma masrafına sahiptir. Bir uygulama, etkinlik yeniden başlatmayı devre dışı bırakmak ve yönlendirme değişikliklerinin el ile denetimini ele geçirebilir.

Bu kılavuzda aşağıdaki yön konuları incelenir:

  • Bildirime dayalı düzen döndürme – belirli yönler için hem mizanpajları hem de drawables yükleme dahil olmak üzere, yönlendirme kullanan uygulamalar oluşturmak için Android kaynak sistemini kullanma.

  • Programlı düzen döndürme – denetimleri programlı bir şekilde ekleme ve yönlendirme değişikliklerinin el ile nasıl işleneceği.

Bir döndürmeyi düzen ile bildirimli olarak işleme

Dosyalar, adlandırma kurallarını izleyen klasörlere dahil edildiğinde, yönlendirme değiştiğinde Android otomatik olarak uygun dosyaları yükler. Buna aşağıdakiler için destek dahildir:

  • Düzen kaynakları : her bir yön için hangi düzen dosyalarının flalanın olduğunu belirtme.

  • Drawable kaynakları : her bir yön için hangi drawables yükleneceğini belirtin.

Düzen kaynakları

Varsayılan olarak, kaynaklara/düzen klasörüne eklenen Android XML (axml) dosyaları, bir etkinliğin görünümlerini işlemek için kullanılır. Özel olarak yatay için başka bir düzen kaynağı sağlanmadıysa, bu klasörün kaynakları hem dikey hem de yatay yönlendirme için kullanılır. Varsayılan proje şablonu tarafından oluşturulan proje yapısını göz önünde bulundurun:

Varsayılan proje şablonu yapısı

Bu proje kaynaklar/düzen klasöründe tek bir Main. axml dosyası oluşturur. Etkinliğin OnCreate yöntemi çağrıldığında, AŞAĞıDAKI XML 'de gösterildiği gibi bir düğme bildiren OnCreate dosyasında tanımlanan görünümü bir daha düzlaştırır:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
<Button  
  android:id="@+id/myButton"
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:text="@string/hello"/>
</LinearLayout>

Cihaz yatay yönlendirmeye döndürülürse, etkinliğin OnCreate yöntemi yeniden çağrılır ve aşağıdaki ekran görüntüsünde gösterildiği gibi aynı OnCreate dosyası de döndürülür:

Aynı ekran, ancak yatay yönde

Orientation-Specific düzenleri

Düzen klasörüne ek olarak (varsayılan olarak dikey olan ve ayrıca adlı bir klasörü dahil ederek Düzen-bağlantı noktası olarak adlandırılmış olabilir ) bir uygulama, herhangi bir kod değişikliği olmadan yatay olarak, gereken görünümleri tanımlayabilir.

Main. axml dosyasının şu xml içerdiğini varsayın:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <TextView
    android:text="This is portrait"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" />
</RelativeLayout>

Projeye ek bir Main. axml dosyası içeren düzen-Land adlı bir klasör eklenirse, yataya göre düzen altına eklendiğinde, artık Android 'e yeni eklenen Main. axml yüklenirken neden olur. Aşağıdaki kodu içeren Main. axml dosyasının yatay sürümünü göz önünde bulundurun (basitlik için, bu XML kodun varsayılan dikey sürümüne benzerdir, ancak içinde farklı bir dize kullanır ):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <TextView
    android:text="This is landscape"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" />
</RelativeLayout>

Bu kodu çalıştırmak ve cihazı dikeyden yataya döndürmek, aşağıda gösterildiği gibi yeni XML yüklemeyi gösterir:

Dikey modu yazdırma dikey ve yatay ekran görüntüleri

Drawable kaynakları

Döndürme sırasında, Android, çizilebilir kaynaklarını düzen kaynaklarına benzer şekilde davranır. Bu durumda, sistem sırasıyla kaynak/drawable ve kaynaklar/drawable-Land klasörlerinden drawables alır.

Örneğin, projenin kaynak/çizilebilir klasöründe Monkey.png adlı bir görüntü içerdiğini varsayalım ve bu, çizilebilir öğesine şunun gibi bir XML 'den başvuruda bulunulmuş olur :

<ImageView
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"
  android:src="@drawable/monkey"
  android:layout_centerVertical="true"
  android:layout_centerHorizontal="true" />

Ayrıca, kaynaklar/drawable-Landaltında farklı bir Monkey.png sürümünün dahil edildiğini varsayın. Düzen dosyalarında olduğu gibi, cihaz döndürüldüğünde, aşağıda gösterildiği gibi, belirtilen yönle ilgili olarak çizilebilir değişir:

Dikey ve yatay modlarda gösterilen Monkey.png farklı sürümü

Döndürmeyi programlı olarak işleme

Bazen koddaki düzenleri tanımlayacağız. Bu, teknik sınırlamalar, geliştirici tercihi vb. gibi çeşitli nedenlerden kaynaklanabilir. Denetimleri programlı olarak eklediğimiz zaman, bir uygulamanın cihaz yönlendirmesi için el ile hesabı olması gerekir ve bu, XML kaynaklarını kullanırken otomatik olarak işlenir.

Kodda denetim ekleme

Program aracılığıyla denetim eklemek için, bir uygulamanın aşağıdaki adımları gerçekleştirmesi gerekir:

  • Düzen oluşturun.
  • Düzen parametrelerini ayarlayın.
  • Denetimler oluşturun.
  • Denetim düzeni parametrelerini ayarlayın.
  • Düzene denetim ekleyin.
  • Düzeni içerik görünümü olarak ayarlayın.

Örneğin, TextViewRelativeLayout aşağıdaki kodda gösterildiği gibi, öğesine eklenen tek bir denetimden oluşan bir kullanıcı arabirimini düşünün.

protected override void OnCreate (Bundle bundle)
{
  base.OnCreate (bundle);
                        
  // create a layout
  var rl = new RelativeLayout (this);

  // set layout parameters
  var layoutParams = new RelativeLayout.LayoutParams (ViewGroup.LayoutParams.FillParent, ViewGroup.LayoutParams.FillParent);
  rl.LayoutParameters = layoutParams;
        
  // create TextView control
  var tv = new TextView (this);

  // set TextView's LayoutParameters
  tv.LayoutParameters = layoutParams;
  tv.Text = "Programmatic layout";

  // add TextView to the layout
  rl.AddView (tv);
        
  // set the layout as the content view
  SetContentView (rl);
}

Bu kod, sınıfının bir örneğini oluşturur RelativeLayout ve LayoutParameters özelliğini ayarlar. LayoutParamsSınıfı, denetimlerin yeniden kullanılabilir bir şekilde nasıl konumlandığını kapsülleyerek Android 'in bir yoludur. Bir düzen örneği oluşturulduktan sonra, denetimler oluşturulup buna eklenebilir. Ayrıca, LayoutParameters Bu örnekteki gibi denetimler de vardır TextView . Oluşturulduktan sonra, TextView öğesine ekleme RelativeLayout ve RelativeLayout içerik görünümü olarak ayarlama, uygulamanın gösterildiği gibi görüntülemesine neden olur TextView :

İki dikey ve yatay modda gösterilen artırma sayacı düğmesi

Kodda yönlendirme algılanıyor

Bir uygulama, çağrıldığında her yön için farklı bir kullanıcı arabirimi yüklemeye çalışırsa OnCreate (Bu, bir cihaz her döndürüldüğünde gerçekleşir), yönü tespit etmelidir ve ardından istenen kullanıcı arabirimi kodunu yükler. Android, WindowManager aşağıda gösterildiği gibi, özelliği aracılığıyla geçerli cihaz döndürmeyi belirlemede kullanılabilecek olan adlı bir sınıfa sahiptir WindowManager.DefaultDisplay.Rotation :

protected override void OnCreate (Bundle bundle)
{
  base.OnCreate (bundle);
                        
  // create a layout
  var rl = new RelativeLayout (this);

  // set layout parameters
  var layoutParams = new RelativeLayout.LayoutParams (ViewGroup.LayoutParams.FillParent, ViewGroup.LayoutParams.FillParent);
  rl.LayoutParameters = layoutParams;
                        
  // get the initial orientation
  var surfaceOrientation = WindowManager.DefaultDisplay.Rotation;
  // create layout based upon orientation
  RelativeLayout.LayoutParams tvLayoutParams;
                
  if (surfaceOrientation == SurfaceOrientation.Rotation0 || surfaceOrientation == SurfaceOrientation.Rotation180) {
    tvLayoutParams = new RelativeLayout.LayoutParams (ViewGroup.LayoutParams.FillParent, ViewGroup.LayoutParams.WrapContent);
  } else {
    tvLayoutParams = new RelativeLayout.LayoutParams (ViewGroup.LayoutParams.FillParent, ViewGroup.LayoutParams.WrapContent);
    tvLayoutParams.LeftMargin = 100;
    tvLayoutParams.TopMargin = 100;
  }
                        
  // create TextView control
  var tv = new TextView (this);
  tv.LayoutParameters = tvLayoutParams;
  tv.Text = "Programmatic layout";
        
  // add TextView to the layout
  rl.AddView (tv);
        
  // set the layout as the content view
  SetContentView (rl);
}

Bu kod, TextView ekranın sol üst kısmından 100 piksel konumlanarak, burada gösterildiği gibi yatay olarak döndürüldüğünde otomatik olarak yeni düzene animasyon uygulamak için ayarlar:

Görünüm durumu dikey ve yatay modlar üzerinde korunur

Etkinliğin yeniden başlamasını önleyin

Bir uygulama, içindeki her şeyi işlemenin yanı sıra OnCreate , bir etkinliğin aşağıdaki şekilde ayarlanarak bir etkinliğin yeniden başlatılmasını engelleyebilir ConfigurationChangesActivityAttribute :

[Activity (Label = "CodeLayoutActivity", ConfigurationChanges=Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize)]

Artık cihaz döndürüldüğünde etkinlik yeniden başlatılmaz. Bu durumda yön değişikliğini el ile işlemek için bir etkinlik yöntemi geçersiz kılabilir OnConfigurationChanged ve Configuration aşağıdaki etkinliğin yeni uygulamasında olduğu gibi, geçirilen nesneden yönlendirmeyi belirleyebilir:

[Activity (Label = "CodeLayoutActivity", ConfigurationChanges=Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize)]
public class CodeLayoutActivity : Activity
{
  TextView _tv;
  RelativeLayout.LayoutParams _layoutParamsPortrait;
  RelativeLayout.LayoutParams _layoutParamsLandscape;
                
  protected override void OnCreate (Bundle bundle)
  {
    // create a layout
    // set layout parameters
    // get the initial orientation

    // create portrait and landscape layout for the TextView
    _layoutParamsPortrait = new RelativeLayout.LayoutParams (ViewGroup.LayoutParams.FillParent, ViewGroup.LayoutParams.WrapContent);
                
    _layoutParamsLandscape = new RelativeLayout.LayoutParams (ViewGroup.LayoutParams.FillParent, ViewGroup.LayoutParams.WrapContent);
    _layoutParamsLandscape.LeftMargin = 100;
    _layoutParamsLandscape.TopMargin = 100;
                        
    _tv = new TextView (this);
                        
    if (surfaceOrientation == SurfaceOrientation.Rotation0 || surfaceOrientation == SurfaceOrientation.Rotation180) {
      _tv.LayoutParameters = _layoutParamsPortrait;
    } else {
      _tv.LayoutParameters = _layoutParamsLandscape;
    }
                        
    _tv.Text = "Programmatic layout";
    rl.AddView (_tv);
    SetContentView (rl);
  }
                
  public override void OnConfigurationChanged (Android.Content.Res.Configuration newConfig)
  {
    base.OnConfigurationChanged (newConfig);
                        
    if (newConfig.Orientation == Android.Content.Res.Orientation.Portrait) {
      _tv.LayoutParameters = _layoutParamsPortrait;
      _tv.Text = "Changed to portrait";
    } else if (newConfig.Orientation == Android.Content.Res.Orientation.Landscape) {
      _tv.LayoutParameters = _layoutParamsLandscape;
      _tv.Text = "Changed to landscape";
    }
  }
}

Burada, TextView's Düzen parametreleri hem yatay hem de dikey için başlatılır. İşlem TextView yönü değiştiğinde etkinlik yeniden oluşturulmayacak olduğundan, sınıf değişkenleri parametreleri kendisiyle birlikte tutar. Kod, surfaceOrientartion ' de OnCreate Başlangıç yerleşimini ayarlamak için ' de kullanır TextView . Bundan sonra, OnConfigurationChanged sonraki tüm düzen değişikliklerini işler.

Uygulamayı çalıştırdığımızda, Android kullanıcı arabirimi değişikliklerini cihaz döndürme işlemi meydana geldiğinde yükler ve etkinliği yeniden başlatmaz.

Bildirim temelli düzenler için etkinlik yeniden başlatmasını önler

Düzeni XML 'de tanımladığımızda cihaz dönüşünün neden olduğu etkinlik yeniden başlatmaları de engellenebilir. Örneğin, bir etkinliğin yeniden başlatılmasını engellemek istiyorsam (Belki de performans nedenleriyle), farklı yönler için yeni kaynaklar yüklemeye gerek kalmaz, bu yaklaşımı kullanabiliriz.

Bunu yapmak için, programlama düzeninde kullandığımız yordamın aynısını izliyoruz. ConfigurationChangesActivityAttribute Daha önce yaptığımız gibi ' de ayarlamanız yeterlidir CodeLayoutActivity . Yönlendirme değişikliği için çalıştırılması gereken tüm kodlar, yönteminde yeniden uygulanabilir OnConfigurationChanged .

Yön değişiklikleri sırasında durumu koruma

Dönüşün bir şekilde veya programlı olarak döndürülüp işlenmeksizin, tüm Android uygulamalarının cihaz yönü değiştiğinde durumu yönetmek için aynı teknikleri uygulaması gerekir. Android cihaz döndürüldüğünde sistem çalışan bir etkinliği yeniden başlattığı için durum yönetimi önemlidir. Android, özellikle belirli bir yön için tasarlanan düzen ve drawables gibi alternatif kaynakların yüklenmesini kolaylaştırır. Yeniden başlatıldığında, etkinlik yerel sınıf değişkenlerinde depolanmış olabilecek geçici durumu kaybeder. Bu nedenle, bir etkinlik durum bağımlı ise, uygulamanın durumunu uygulama düzeyinde kalıcı hale vermelidir. Bir uygulamanın, yönlendirme değişikliklerinde korumak istediği herhangi bir uygulama durumunu kaydetmeyi ve geri yüklemeyi işlemesi gerekir.

Android 'de kalıcı durum hakkında daha fazla bilgi için etkinlik yaşam döngüsü kılavuzuna bakın.

Özet

Bu makalede, Android 'in yerleşik yeteneklerini döndürme ile çalışmak için nasıl kullanılacağı ele alınmıştır. İlk olarak, yönlendirme kullanan uygulamalar oluşturmak için Android kaynak sisteminin nasıl kullanılacağını anlatılmıştı. Daha sonra, kodda denetimlerin nasıl ekleneceğini ve yönlendirme değişikliklerinin el ile nasıl işleneceğini sunduğunu öğrenirsiniz.