実行時にビューを別のビューに置き換えるAndroidレイアウト


175

私が持っているxml2 textviews A / Bの主な-layoutファイルを、ビューC.私は2つの他の持っているxml-layoutファイルをoption1してoption2。Javaを介して、option1またはoption2ランタイムでC にロードすることは可能ですか?その場合、どの機能を使用する必要がありますか?

回答:


372

いつでも任意のビューを置き換えることができます。

int optionId = someExpression ? R.layout.option1 : R.layout.option2;

View C = findViewById(R.id.C);
ViewGroup parent = (ViewGroup) C.getParent();
int index = parent.indexOfChild(C);
parent.removeView(C);
C = getLayoutInflater().inflate(optionId, parent, false);
parent.addView(C, index);

既存のViewを置き換えたくないが、初期化時にoption1 / option2を選択する場合は、これをより簡単に行うことができますandroid:id

ViewGroup parent = (ViewGroup) findViewById(R.id.parent);
View C = getLayoutInflater().inflate(optionId, parent, false);
parent.addView(C, index);

ビューの構造に応じて、「インデックス」を適切な値に設定する必要があります。ViewStubを使用することもできます。CビューをViewStubとして追加し、次のようにします。

ViewStub C = (ViewStub) findViewById(R.id.C);
C.setLayoutResource(optionId);
C.inflate();

そうすれば、XMLレイアウトを再構築する場合に、上記の「インデックス」値を気にする必要がなくなります。


フラグメントを削除する必要がありますか、それともフラグメントも削除されますか?
K-SOの毒性が高まっています。

3
@KarlMorrisonこの質問はほぼ4年前のもので、フラグメントとは関係ありません。新しい質問を提出するかandroid.app.FragmentTransaction、そのreplace()方法を確認することをお勧めします。
lupz 14

コメントに- - :-(初心者のAndroidプログラマのためのそれはあなたの答えはあまりにも複雑で残念です
アントニオ・セスト

2
@AntonioSesto何が複雑すぎるのですか?どこで混乱しましたか?
AdamMc331 2015

@broot私は私が行ったlinearlayoutに日別で画像を追加したいと思います。後で、一部の画像をレイアウトから削除します。次に、削除した場所から元の位置に復元します。子供の親を削除せずに画像を追加したいという意味ですか、どうか私を助けてください?
PriyankaChauhan 2017

43

そして、それを頻繁に行う場合は、ViewSwitcherまたはViewFlipperを使用して、ビューの置換を容易にすることができます。


はい、別のビューの質問がある場合は、ビューフリッパー/スイッチャーを使用することをお
勧め

2
@Shail Adi、ViewSwitcherチュートリアルコードを削除しようとしましたか?
Snicolas

私はこれが古いことを知っていますが、注意点は、ViewSwitcherが両方のビューを初期化して保持することです(FrameLayout)。
Vikram Bodicherla

これは推奨される回答です。十分にテストされた既製のソリューションを使用しないでください。

3
private void replaceView(View oldV,View newV){
        ViewGroup par = (ViewGroup)oldV.getParent();
        if(par == null){return;}
        int i1 = par.indexOfChild(oldV);
        par.removeViewAt(i1);
        par.addView(newV,i1);
    }

6
このコードは質問に答えることがありますが、問題を解決する方法および/または理由に関する追加のコンテキストを提供することで、回答の長期的な価値が向上します
frobinsonj

0

私の場合、oldSensorとnewSnsor-oldViewとnewViewで機能します。

private void replaceSensors(View oldSensor, View newSensor) {
            ViewGroup parent = (ViewGroup) oldSensor.getParent();

            if (parent == null) {
                return;
            }

            int indexOldSensor = parent.indexOfChild(oldSensor);
            int indexNewSensor = parent.indexOfChild(newSensor);
            parent.removeView(oldSensor);
            parent.addView(oldSensor, indexNewSensor);
            parent.removeView(newSensor);
            parent.addView(newSensor, indexOldSensor);
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.