ViewBinding - dahil edilen düzenler için ciltleme nasıl alınır?


11

ViewBinding ile çalışırken belgelenmemiş birkaç vaka ile karşılaşıyorum.

Birincisi: Dahil edilen genel görünüm mizanpaj parçaları için ciltleme nasıl alınır, ana ciltleme yalnızca ana mizanpajdaki öğeleri görebilir?

İkincisi: Eklenen birleştirme türü düzen parçaları için nasıl ciltleme yapılır, yine ana ciltleme yalnızca ana düzendeki öğeleri görebilir?

Yanıtlar:


15

Aşağıdaki durumlarda:

  1. Genel mizanpajı dahil et (düğümü birleştirmek için değil), dahil edilen parçaya kimlik atamamız gerekiyor, bu şekilde bağlamada dahil edilen alt parçaya erişimimiz olacak
<include
    android:id="@+id/your_id"
    layout="@layout/some_layout" />

Etkinlik kodunuzda şu şekilde:

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    setContentView(exampleBinding.root)
    //we will be able to access included layouts view like this
    val includedView: View = exampleBinding.yourId.idOfIncludedView
//[...]
}
  1. Harici düzende birleştirme bloğuna dahil et. Birleştirme bloğu bir görünüm olmadığından buna kimlik ekleyemeyiz. Diyelim ki böyle sonsuz birleştirme düzenimiz var (merge_layout.xm):
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="@layout/activity_example">

    <TextView
        android:id="@+id/some_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World" />
</merge>

Bu tür birleştirme düzenini doğru bir şekilde bağlamak için şunları yapmamız gerekir:

Etkinlik kodunuzda:

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout
private lateinit var mergeBinding: MergeLayoutBinding  //merge_layout.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    //we need to bind the root layout with our binder for external layout
    mergeBinding = MergeLayoutBinding.bind(exampleBinding.root)
    setContentView(exampleBinding.root)
    //we will be able to access included in merge layout views like this
    val mergedView: View = mergeBinding.someView
//[...]
}

1
Bu bir hata gibi görünüyor. O gerektiğini sadece iş .
miguel

7

ViewBinding kullanarak dahil edilen bir mizanpajla çalışan ilk sorunuz bu kadar kolay çözülebilir.

Örnek bir main_fragment.xml dosyası

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

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view_main"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

</LinearLayout>

Ve MainFragment.java böyle olabilir

public class MeaningFragment extends Fragment {

    private MainFragmentBinding binding;
    private ToolbarBinding toolbarBinding;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        binding = MainFragmentBinding.inflate(inflater, container, false);
        toolbarBinding = binding.toolbar;

        return binding.getRoot();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        toolbarBinding = null;
        binding = null;
    }
}

Şimdi, iki bağlantınız var. bunlardan biri varsayılan, diğeri dahil edilen düzenden.


1
Çok basit bir cevap ve yeni sözdizimini kullanıyor - hepsi benim için benzer sözdizimine sahip bir Fragman Olmayan Aktivitede çalışıyor onCreate(). Teşekkürler. (Sadece a kullanarak sorun biraz DrawerLayout)
Yağ Keşiş

0

Diğer basit yol veri bağlama kütüphanesini kullanmaktır. Ardından, kitaplığı kullanıyorsanız, düzendeki görünümleri veri nesnelerinizle bağlamak için gerekli sınıfları otomatik olarak oluşturacak şekilde XML düzeninizi etiketle sarın. Dürüst olmak gerekirse, bence bu yol. Buradaki kılavuzu izleyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.