Android:如何以编程方式从 xml 中删除对象

Android: How to Remove an object from xml programatically

在我的应用程序中,我在 LinearLayout(垂直)中有一个 AdView 对象和 浮动按钮 。我希望当用户购买应用程序内购买时 "Remove ads" 从 xml 中删除 AdView 对象,以便 FAB 按钮将其地方。像这样:

无广告:

我该怎么做? 那是我的 xml 代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:materialdesign="http://schemas.android.com/apk/res-auto"
            xmlns:fab="http://schemas.android.com/apk/res-auto"
            xmlns:ads="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:id="@+id/myMainRelativeLayout"
            android:layout_height="match_parent"
            tools:context=".MainActivity">
<include
    android:id="@+id/tool_bar"
    layout="@layout/tool_bar">
</include>

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:clickable="true"
    android:background="?android:selectableItemBackground"
    android:id="@+id/recyclerView"
    android:layout_below="@+id/tool_bar"
    />

<TextView android:id="@+id/list_empty"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="No Shopping Items yet"
          android:layout_centerVertical="true"
          android:layout_centerHorizontal="true"/>

<LinearLayout
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:weightSum="100"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true">

    <com.software.shell.fab.ActionButton
        android:id="@+id/buttonFloat"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="50"
        android:layout_gravity="center"
        fab:show_animation="@anim/fab_roll_from_down"
        fab:hide_animation="@anim/fab_roll_to_down"/>

    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="50"
        ads:adSize="BANNER"
        ads:adUnitId="@string/banner_ad_unit_id">
    </com.google.android.gms.ads.AdView>
</LinearLayout>

这是我删除广告视图的代码:

mIsRemoveAdds = inventory.hasPurchase(SKU_REMOVE_ADDS);
            if(!mIsRemoveAdds) {
                Toast.makeText(MainActivity.this,"no premium",Toast.LENGTH_LONG).show();
                mAdView = (AdView) findViewById(R.id.adView);
                AdRequest adRequest = new AdRequest.Builder().build();
                mAdView.loadAd(adRequest);
            }else{

                if(mAdView != null) {
                    mAdView.setVisibility(View.GONE);
                }
                Toast.makeText(MainActivity.this,"premium",Toast.LENGTH_LONG).show();
            }

要删除您可以使用的任何视图,其中 ll 是您的父级线性布局

ll.removeView(view)// to remove particular view
ll.removeViewAt(position);// to remove view from particular position

或者,您也可以将 adView 的 visibility 设置为 GONE,结果会将其放置在按钮上。

adButton.setVisibility(View.GONE);  

编辑:
在查看了您的 XML 之后,我认为是它的重量造成了问题。
您应该在隐藏 adView

的地方将 floatingButton layout_weight 设置为 100
floatingButton.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 100f));

编辑:
我建议不要使用权重,因为你不需要它们。

xml中的视图如果要动态判断是否显示不实用。如果您仍想添加到 xml,您可以将其设置为不可见或 detach/remove 视图。否则,不要在 Xml 中添加 AdView。我按如下方式处理这种情况:

        adView = new MoPubView(this.getApplicationContext());
        adView.setAdUnitId(getString(R.string.mopub_banner_adunitid));
        adView.refreshDrawableState();
        adView.setBannerAdListener(this);
        if(!Prefs.getUserPreferenceBooleanValue(Prefs.Key.REMOVE_ADS_PAID, this)) {
              frameLayout.addView(adView, bannerViewLayoutParams);      
              adView.loadAd();

        }

在您的代码中以编程方式添加 adview。在共享首选项中存储一个标志,并根据需要设置它以显示或删除广告。当 activity 加载时,读取标志并确定是否将 adview 添加到布局中。

对于按钮的大小,您可以将其发送为相对于可用 space 或根据标志的值调整大小。

假设 youViewName 是您要删除的视图。 如果它是 LinearLayout 使用下面的代码,否则如果它是 RelativeLayout 将下面代码中的 LinearLayout 替换为RelativeLayout

((LinearLayout) youViewName.getParent()).removeView(youViewName);

在您的情况下,下面的行应该有效

((LinearLayout) mAdView.getParent()).removeView(mAdView);