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

DropHelper sınıfı çok daha basittir uygulanmasına yardımcı olur. Jetpack'in bir üyesi DragAndDrop kitaplığı, DropHelper API düzeyi 24'e kadar geriye dönük uyumluluk sağlar.

Lansman hedeflerini belirtmek, bırakma hedefi vurgulamasını özelleştirmek için DropHelper ve çıkarılan verilerin nasıl işleneceğini tanımlar.

Sürükleme kaynağını ayarla

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

OnDragStartListener bölgesinde, geçersiz kılma yöntemi onDragStart(). ClipData nesnesi oluşturun ve taşınan veriler için ClipData.Item nesne. ClipData kapsamında, ClipDescription nesnesinde depolanan meta verileri ClipData Veri hareketini temsil etmeyen sürükleyip bırakma 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);
    }
});

Lansman hedeflerini belirleyin

Kullanıcı bir görünümün üzerine gölge bıraktığında görünümün yapılandırılması gerekir ve doğru yanıt vermek için layıkıyla gereklidir.

DropHelper.configureView() düşüş hedeflerini belirtmenize olanak tanıyan statik ve aşırı yüklenmiş bir yöntemdir. Bu parametreleri aşağıdakileri içerir:

Örneğin, resim kabul eden bir düşüş hedefi oluşturmak için aşağıdaki yöntem çağrıları:

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 ayarlandığında, vurgu köşe yarıçapı 16 dp olarak ayarlı ve EditText bileşenleri boştur. Ayrıntılar için aşağıdaki bölüme bakın.

Lansman hedeflerini yapılandırın

DropHelper.Options inner class ile bırakma hedeflerini yapılandırmanız gerekir. Aşağıdakilere sınıfın bir örneğini sağlayın: DropHelper.configureView(Activity, View, String[], Options, OnReceiveContentListener) yöntemidir. Daha fazla bilgi edinmek için önceki bölüme bakın.

Hedef vurgulamayı özelleştirin

DropHelper, kullanıcılar sürüklerken bir vurgulama gösterecek şekilde bırakma hedeflerini yapılandırır hedeflerin üzerindedir. DropHelper, varsayılan stil özellikleri sağlar ve DropHelper.Options, vurgu rengini ayarlamanıza ve vurgunun dikdörtgeninin köşe yarıçapını belirler.

Şunu kullanın: DropHelper.Options.Builder sınıfını kullanarak DropHelper.Options örneği oluşturun ve yapılandırma seçeneklerini ayarlayın. aşağıdaki örnekte gösterildiği gibi:

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şleme

DropHelper, hedef şunları içerdiğinde odaklanma hedefi içinde odağı da kontrol eder: düzenlenebilir metin alanları.

Bırakma hedefleri, tek bir görünüm veya bir görünüm hiyerarşisi olabilir. Düşen hedef görünümü hiyerarşi bir veya daha fazla EditText içeriyorsa bileşenlerin listesini çıkarıp DropHelper.Options.Builder.addInnerEditTexts(EditText...) .

DropHelper, bırakma hedefi görünümündeki EditText bileşeni engelliyor hiyerarşinin, sürükleme etkileşimleri sırasında kapsayıcı görünümden odağı çalmasına engel olur.

Ayrıca, sürükleyip bırakma ClipData metin ve URI verilerini içeriyorsa, DropHelper, EditText değerlerinden birini seçer bileşenlerden bazılarını hariç tutmalısınız. Seçim şuna göre yapılır: şu öncelik sırasına göre:

  1. ClipData öğesinin atıldığı EditText.
  2. Metin imlecini içeren EditText (düzeltme işareti).
  3. Şu kullanıcıya yapılan arama için sağlanan ilk EditText: DropHelper.Options.Builder.addInnerEditTexts(EditText...).

Varsayılan metin veri işleyicisi olarak bir EditText ayarlamak için EditText öğesini şu şekilde geçirin: çağrısının ilk bağımsız değişkeni DropHelper.Options.Builder.addInnerEditTexts(EditText...). Örneğin, lansman hedefiniz resimleri işliyor ancak düzenlenebilir metin alanları içeriyor T1, T2 ve T3 için T2 öğesini şu şekilde varsayılan olarak ayarlayı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();

Düşüş hedeflerindeki verileri işleme

DropHelper.configureView() yöntemi OnReceiveContentListener kabul eder için oluşturduğunuz öğedir. ClipData. Sürükleme ve bırakma verileri dinleyiciye ContentInfoCompat nesnesini tanımlayın. Metin verileri nesnede var. Resimler gibi medya, URI'lar.

Ayrıca OnReceiveContentListener, düşüş hedefine sağlanan verileri şu şekilde işler: sürükle ve bırak dışındaki kullanıcı etkileşimleri (örneğin, kopyalama ve yapıştır: Aşağıdakileri yapılandırmak için DropHelper.configureView() kullanıldığında Görünüm türleri:

  • 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 kadar Android sürümü çalıştırıyorsa.
ziyaret edin.

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

DropHelper tarafından yapılan MIME türü kontrolü, sürükleyip bırakma işlemine göre ClipDescription sağlayan uygulama tarafından oluşturulur. Şunları doğrulayın: MIME türlerinin doğru şekilde ayarlandığından emin olmak için ClipDescription.

DropHelper, ClipData sürükleyip bırakın. Daha fazla bilgi için bkz. DragAndDropPermissions. İlgili içeriği oluşturmak için kullanılan izinleri, sürükleyip bırakma işlemini işlerken içerik URI'lerini çözümlemenizi sağlar dışı verilerdir.

DropHelper, aşağıdaki durumlarda içerik sağlayıcılar tarafından döndürülen verileri doğrulamaz: bırakılan verilerdeki URI'leri çözümliyor. Boş değer olup olmadığını kontrol edin ve tüm çözümlenmiş veriler dahildir.