Basitleştirilmiş sürükle ve bırak için DropHelper

DropHelper sınıfı, sürükle ve bırak özelliklerinin uygulanmasını kolaylaştırır. Jetpack DragAndDrop kitaplığının bir üyesi olan DropHelper, API düzeyi 24'e kadar geriye dönük uyumluluk sunar.

Bırakma hedefleri belirtmek, bırakma hedefi vurgulamasını özelleştirmek ve bırakılan verilerin nasıl işleneceğini tanımlamak için DropHelper öğesini kullanın.

Sürükleme kaynağını ayarla

Başlamak için sürükleme kaynak görünümü ve OnDragStartListener ile DragStartHelper oluşturun.

OnDragStartListener'da onDragStart() yöntemini geçersiz kılın. Taşınmakta olan veriler için bir ClipData ve ClipData.Item nesnesi oluşturun. ClipData kapsamında, ClipData içindeki ClipDescription nesnesinde depolanan tedarik meta verileri. Veri taşımayı temsil etmeyen bir sürükle ve bırak işlemi için gerçek bir nesne yerine null kullanmak isteyebilirsiniz.

Kotlin

DragStartHelper(draggableView)
    { view: View, _: DragStartHelper ->
        val item = ClipData.Item(view.tag as? CharSequence)
        val dragData = ClipData(
            view.tag as? CharSequence,
            arrayOf(ClipDescription.MIMETYPE_TEXT_PLAIN),
            item
        )
        view.startDragAndDrop(
            dragData,
            View.DragShadowBuilder(view),
            null,
            0
        )
    }.attach()

Java

new DragStartHelper(draggableView, new DragStartHelper.OnDragStartListener() {
    @Override
    public void onDragStart(View view, DragStartHelper helper) {
        CharSequence tag = (CharSequence) view.getTag();
        ClipData.Item item = new ClipData.Item(tag);
        ClipData dragData = new ClipData(
          tag, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}, item);
        view.startDragAndDrop(
          dragData, new View.DragShadowBuilder(view), null, 0);
    }
});

Düşme hedefleri belirtme

Kullanıcı bir görünümün üzerine gölge koyduğunda görünümün, verileri kabul edecek ve doğru şekilde yanıt verecek şekilde uygun şekilde yapılandırılması gerekir.

DropHelper.configureView(), bırakma hedefleri belirtmenizi sağlayan, statik ve aşırı yüklenmiş bir yöntemdir. Parametreler şunları içerir:

Örneğin, resim kabul eden bir bırakma hedefi oluşturmak için aşağıdaki yöntem çağrılarından birini kullanın:

Kotlin

configureView(
    myActivity,
    targetView,
    arrayOf("image/*"),
    options,
    onReceiveContentListener)

// or

configureView(
    myActivity,
    targetView,
    arrayOf("image/*"),
    onReceiveContentListener)

Java

DropHelper.configureView(
    myActivity,
    targetView,
    new String[] {"image/*"},
    options,
    onReceiveContentlistener);

// or

DropHelper.configureView(
    myActivity,
    targetView,
    new String[] {"image/*"},
    onReceiveContentlistener);

İkinci çağrı, bırakma hedefi yapılandırma seçeneklerini atlar. Bu durumda, bırakma hedefi vurgu rengi temanın ikincil (veya vurgu) rengine, vurgu köşesi yarıçapı 16 dp olarak ayarlanır ve EditText bileşenlerinin listesi boş olur. Ayrıntılar için aşağıdaki bölüme bakın.

Düşme hedeflerini yapılandırma

DropHelper.Options iç sınıfı, bırakma hedeflerini yapılandırmanıza olanak tanır. DropHelper.configureView(Activity, View, String[], Options, OnReceiveContentListener) yöntemine sınıfın bir örneğini sağlayın. Daha fazla bilgi için önceki bölüme bakın.

Açılır hedefi vurgulamayı özelleştirin

DropHelper, kullanıcılar içeriği hedeflerin üzerine sürükledikçe vurguyu gösterecek şekilde bırakma hedeflerini yapılandırır. DropHelper, varsayılan stil özellikleri sunar. DropHelper.Options ise vurgu renginin rengini ayarlayabilmenizi ve vurgunun dikdörtgeninin köşe yarıçapını belirtmenizi sağlar.

DropHelper.Options örneği oluşturmak ve yapılandırma seçeneklerini aşağıdaki örnekte gösterildiği gibi ayarlamak için DropHelper.Options.Builder sınıfını kullanın:

Kotlin

val options: DropHelper.Options = DropHelper.Options.Builder()
                                      .setHighlightColor(getColor(R.color.purple_300))
                                      .setHighlightCornerRadiusPx(resources.getDimensionPixelSize(R.dimen.drop_target_corner_radius))
                                      .build()

Java

DropHelper.Options options = new DropHelper.Options.Builder()
                                     .setHighlightColor(getColor(R.color.purple_300))
                                     .setHighlightCornerRadiusPx(getResources().getDimensionPixelSize(R.dimen.drop_target_corner_radius))
                                     .build();

Bırakma hedeflerindeki EditText bileşenlerini işleyin

DropHelper, hedef düzenlenebilir metin alanları içerdiğinde bırakma hedefi içindeki odağı da kontrol eder.

Bırakma hedefleri, tek bir görünüm veya görünüm hiyerarşisi olabilir. Açılır hedef görünüm hiyerarşisi bir veya daha fazla EditText bileşeni içeriyorsa bırakma hedefi vurgulamasının ve metin verilerinin işlenmesinin doğru bir şekilde çalıştığından emin olmak için DropHelper.Options.Builder.addInnerEditTexts(EditText...)'e bileşenlerin listesini sağlayın.

DropHelper, bırakma hedefi görünümü hiyerarşisindeki EditText bileşenlerinin sürükleme etkileşimleri sırasında odağı içeren görünümden çalmasını engeller.

Ayrıca, sürükle ve bırak işlevi ClipData metin ve URI verilerini içeriyorsa DropHelper, metin verilerini işlemek için bırakma hedefindeki EditText bileşenlerinden birini seçer. Seçim, aşağıdaki öncelik sırasına göre yapılır:

  1. ClipData öğesinin bırakıldığı EditText.
  2. Metin imlecini (düzeltme işareti) içeren EditText.
  3. İlk EditText, DropHelper.Options.Builder.addInnerEditTexts(EditText...) için yapılan çağrıya sağlanan.

EditText öğesini varsayılan metin veri işleyicisi olarak ayarlamak için EditText öğesini, DropHelper.Options.Builder.addInnerEditTexts(EditText...) çağrısının ilk bağımsız değişkeni olarak iletin. Örneğin, bırakma hedefiniz resimleri işliyor ancak T1, T2 ve T3 düzenlenebilir metin alanları içeriyorsa T2 öğesini aşağıdaki gibi varsayılan yapın:

Kotlin

val options: DropHelper.Options = DropHelper.Options.Builder()
                                      .addInnerEditTexts(T2, T1, T3)
                                      .build()

Java

DropHelper.Options options = new DropHelper.Options.Builder()
                                     .addInnerEditTexts(T2, T1, T3)
                                     .build();

Bırakma hedeflerindeki verileri işleyin

DropHelper.configureView() yöntemi, ClipData sürükleyip bırakma işlemini işlemek için oluşturduğunuz bir OnReceiveContentListener öğesini kabul eder. Sürükleyip bırakma verileri işleyiciye bir ContentInfoCompat nesnesinde sağlanır. Nesnede metin verileri var. Medya (resimler gibi) URI'larla temsil edilir.

Aşağıdaki görünüm türlerini yapılandırmak için DropHelper.configureView() kullanıldığında OnReceiveContentListener, bırakma hedefine sürükle ve bırak dışındaki (kopyalama ve yapıştırma gibi) kullanıcı etkileşimleri tarafından sağlanan verileri de işler:

  • Kullanıcı Android 12 veya sonraki bir sürümü çalıştırıyorsa tüm görünümler.
  • AppCompatEditText: Kullanıcı, Android 7.0'a kadarki bir Android sürümünü çalıştırıyorsa.

MIME türleri, izinler ve içerik doğrulama

DropHelper tarafından kontrol edilen MIME türü, sürükle ve bırak verilerini sağlayan uygulama tarafından oluşturulan sürükle ve bırak ClipDescription yöntemine dayanır. MIME türlerinin doğru şekilde ayarlandığından emin olmak için ClipDescription öğesini doğrulayın.

DropHelper, sürükle ve bırak ClipData işlevinde bulunan içerik URI'leri için tüm erişim izinlerini ister. Daha fazla bilgi için DragAndDropPermissions adresini inceleyin. İzinler, sürükle ve bırak verilerini işlerken içerik URI'lerini çözümlemenize olanak tanır.

DropHelper, bırakılan verilerdeki URI'ları çözerken içerik sağlayıcılar tarafından döndürülen verileri doğrulamaz. Boş olup olmadığını kontrol edin ve çözülmüş verilerin doğruluğunu onaylayın.