web-dev-qa-db-ja.com

カスタムビュークラスでのXMLレイアウトの拡張

クラスがありますView1Viewを拡張します。膨らませたいR.layout.test2.xmlこのクラスのView1。このクラスに次のコードを入れました

public class View1 extends View {

    View view;
    String[] countries = new String[] {"India", "USA", "Canada"};

    public View1( Context context) {
        super(context);
        LayoutInflater  mInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view=mInflater.inflate(R.layout.test2, null, false);
    }
}

別のクラスHomeから、この膨らんだビューが状況によってはそこにあるようにしたいHomeクラスでは、次のコードを書きました:

public class Home extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);
        CreateView();   
    }

    public void CreateView() {
        LinearLayout lv=(LinearLayout)findViewById(R.id.linearlayout);
        View1 view = new View1(Home.this);
        lv.addView(view);
    }
}

しかし、プロジェクトを実行すると、アクティビティには何も表示されません。

35

代わりにViewクラスにビューを追加することはできません。代わりにViewGroupまたはそのサブクラスの1つ(LinearlayoutRelativeLayoutなど)を使用する必要があります。次に、コードは次のようになります。

public class View1 extends LinearLayout {

    View view;
    String[] countries = new String[] {"India", "USA", "Canada"};

    public View1( Context context) {
        super(context);
        LayoutInflater  mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mInflater.inflate(R.layout.test2, this, true);}}

また、行:

mInflater.inflate(R.layout.test2, null, false)

falseパラメーターのために、現在のビューに何も追加しません。xmlレイアウトからViewを膨らませます。

50
Luksprog

これを使って

    LayoutInflater li = (LayoutInflater)getContext().getSystemService(infService);
    li.inflate(R.layout.test2, **this**, true);

Nullではなくthisを使用し、falseパラメーター(boolean AttachToRoot)をtrueに変更する必要があります。

11
Aracem

以下のコードを使用してレイアウトを膨らませると、そのビューをあらゆる目的に使用できます。これにより、XMLファイルの最も親のレイアウトが得られます。 castと入力し、それに応じて使用します。

View headerView = View.inflate(this, R.layout.layout_name, null);
3
Bharat Sharma

ViewGroupのようなFrameLayoutを使用する必要があります。

public class View1 extends FrameLayout {

    public View1(Context context) {
        super(context);
        inflate(context, R.layout.view1, this);
    }
}

レイアウトXMLで、<mergeタグを使用して、ルートレイアウトにview1レイアウトを追加するだけでなく、空のFrameLayoutと定義済みのビューが互いに隣接していることを意味します。

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

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:text="content" />

</merge>

http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/ を参照してください

1
Marius

ホームアクティビティの空白のビューに追加しています。 View1クラスではビューを膨張させるだけで、どこにも追加できないためです。

1
d.k.