185

xml2つのテキストビューA/BとビューCを持つメインの-layoutファイルがあります。他に2つの-layoutxmlファイルoption1とがありoption2ます。Javaを介してCにロードすることは可能ですoption1か?option2もしそうなら、私はどの機能を使用する必要がありますか?

4

4 に答える 4

382

ビューはいつでも置き換えることができます。

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);

既存のビューを置き換えたくないが、初期化時に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レイアウトを再構築する場合に、上記の「インデックス」値について心配する必要がなくなります。

于 2010-09-21T11:55:25.260 に答える
44

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

于 2011-05-05T08:40:09.550 に答える
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);
    }
于 2019-06-27T14:58:09.857 に答える
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);
        }
于 2018-04-06T14:42:27.983 に答える