无法将对象传递给我的自定义复合控件

时间:2019-07-16 14:05:38

标签: android android-custom-view mvp

我正在为我的Android项目使用MVP。 我有一个POJO Product,需要能够在单独的活动中显示此产品的详细信息。此活动需要2种不同的布局: 1.带有按钮的布局,用于打印此产品的详细信息 2.具有2个按钮的布局,可将所选产品添加到愿望清单或取消操作

上述两种布局均具有相同的xml布局以显示详细信息,因此我想制作一个复合组件,例如去杂here

我想用MVP架构实现这一点。因此,我的目标是拥有一个扩展ConstraintLayout并作为我的观点的课程。该视图拥有自己的演示者,以TextView中的数据设置Product

所有这些都有效,但是我无法传递具有化合物成分的活动的演示者中选择的Product,导致该产品的数据未显示在化合物中。 / p>

DetailCompound.java

public class DetailsCompound extends ConstraintLayout {
    TextView productTv, brandTv, sizeTv, extraTv, materialTv, familyTv;
    ImageView codeImg;
    DetailPresenter presenter;

    public DetailsCompound(Context context, Product product) {
        super(context);
        this.initViews(context);
        this.createPresenter(product);
    }

    private void initViews(Context context) {
        inflate(this.getContext(), R.layout.product_details, this);

        //initialize views
    }

    private void createPresenter(Product product) {
        this.presenter = new DetailPresenter(this, product);
    }
}

DetailPresenter.java

public class DetailPresenter implements OnLoadListener {
    DetailsCompound compound;
    StorageManager storage;
    Product product;

    public DetailPresenter(DetailsCompound compound, Product product) {
        this.compound = compound;
        this.storage = new StorageManager();
        this.storage.setOnLoadListener(this);
        this.setProduct(product);
    }

    private void setProduct(Product product) {
        this.product = product;

        //set details of product in view

        this.storage.getProductCodeImage(this.product.getCodeUrl());
    }

    @Override
    public void onLoad(Object loadedObj) {
        this.compound.codeImg.setImageBitmap((Bitmap) loadedObj);
    }
}

包含化合物的activity_product_detail.xml

<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:id="@+id/linearLayout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:paddingHorizontal="8dp"
    tools:context=".productdetail.ProductDetailActivity">

    <include
        android:id="@+id/product_details"
        layout="@layout/product_details"
        android:layout_width="395dp"
        android:layout_height="534dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toTopOf="@+id/print_btn"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/print_btn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Print"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

ProductDetailActivity.java

public class ProductDetailActivity extends AppCompatActivity {
    Button printBtn;

    DetailsCompound productDetails;
    ProductDetailPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_product_detail);

        createPresenter();
        initViews();
    }

    private void initViews() {
        this.productDetails = new DetailsCompound(this.getApplicationContext(), this.presenter.product);
        printBtn = (Button)findViewById(R.id.print_btn);
    }

    private void createPresenter() {
        this.presenter = new ProductDetailPresenter(this);
    }
}

我不知道如何将<include>中的activity_product_detail.xmlDetailCompound.java

“链接”

2 个答案:

答案 0 :(得分:1)

所以,我知道了...

我的逻辑很好,但是我只是不知道如何使用复合组件。 这是我的解决方法:

实现化合物的activity_product_detail.xml

<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:paddingHorizontal="8dp">

    <com.example.imanager.compounds.details.DetailsCompound
        android:id="@+id/product_details"
        android:layout_width="395dp"
        android:layout_height="534dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toTopOf="@+id/print_btn"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/print_btn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Print"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

它没有用,因为我使用了<include>标签而不是实现复合 java类本身。在这个Java类中,充气器用于充气可重复使用的UI组件:

private void initViews() {
        LayoutInflater.from(getContext()).inflate(R.layout.compound_product_details, this);

        //init views
    }

在活动ProductDetailActivity.java中,该活动包含化合物,我们只是实例化执行此操作的化合物:

this.productDetails = (DetailsCompound)findViewById(R.id.product_details);
        this.productDetails.getPresenter().setProduct(this.presenter.product);

答案 1 :(得分:-1)

您可以通过Intent将POJO中的任何详细信息发送给另一个活动