15

さて、MainActivity というアクティビティがあり、layout1layout2という 2 つのレイアウトがあり、どちらもボタンがほとんどないとします。デフォルトの MainActivityレイアウトは、次のようなlayout1です。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout1);

私が実際に行ったことは、layout1のボタンをクリックすることで、2 番目のレイアウトは次のように設定されます。

    someBtn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setContentView(R.layout.layout2);
        }
    });

次のように、 layout2に別のボタンがあり、layout1に戻ります。

    someBtn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setContentView(R.layout.layout1);
        }
    });

問題は、 layout1に戻ったときにsomeBtn1 のOnClickListenerが機能しないことです。layout1の someBtn1 にOnClickListenerを再度設定する必要があるようです。ベストプラクティスで完璧に動作するようにコードを書くにはどうすればよいですか?

4

5 に答える 5

26

ベスト プラクティスは、コンテンツ ビューを変更する代わりにフラグメントを使用することです。

コードでは、レイアウトを含む setContentView は毎回すべてのビューを再作成 (インフレート) するため、someBtn2 クリック リスナーで setContentView(R.layout.layout1) を呼び出すと、関連付けられたリスナーなしで新しいボタンが作成されます。

フラグメントを使用したくない場合は、次のようにします。

private View view1, view2;

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  view1 = getLayoutInflater().inflate(R.layout.layout1, null);
  view2 = getLayoutInflater().inflate(R.layout.layout2, null);
  setContentView(view1);

リスナーは次のようになります。

someBtn1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        setContentView(view2);
    }
});


someBtn2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        setContentView(view1);
    }
});
于 2013-06-12T16:14:38.587 に答える
1

これを行う 1 つの方法は、両方のビューを にロードしてから、表示しonCreate(...)たくないビューを非表示にしてそれらを切り替えることです。次のようなもの:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    LayoutParams default_layout_params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    View view1 = inflater.inflate(R.layout.layout1, null);
    addContentView(view1, default_layout_params);           
    View view2 = inflater.inflate(R.layout.layout2, null);
    addContentView(view2, default_layout_params);
    view2.setVisibility(View.INVISIBLE);
    view1.setVisibility(View.VISIBLE);
    view1.bringToFront();
于 2013-06-12T16:08:53.303 に答える
0

layout1 をコールバックするときに、データを再設定する必要があります。

両方のレイアウトを 1 つにマージしてから、ViewFlipper を使用してそれらを切り替えることができます。

于 2013-06-12T16:08:23.257 に答える