簡體   English   中英

如何在android中動態設置布局

[英]How to set layout dynamically in android

好吧,假設有一個名為MainActivity的Activity,有兩個名為layout1layout2的布局都有幾個按鈕。 默認情況下, MainActivity布局是layout1 ,如下所示:

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

現在我所做的實際上是通過單擊layout1中的按鈕,第二個布局設置如下:

    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。 我如何編寫代碼以使它們與最佳實踐完美配合?

最佳做法是使用片段而不是更改內容視圖。

在您的代碼中,帶有布局的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);
    }
});

如果您只想使用當前代碼,那么問題的解決方案是在布局更改時必須重新聲明偵聽器,如下所示:

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

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

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

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

避免兩次聲明偵聽器的另一種方法是聲明兩個方法來處理布局更改並使用每個布局中按鈕的onClick屬性,例如:

public void setLayout1(View view) {
    setContentView(R.layout.layout1);
}

public void setLayout2(View view) {
    setContentView(R.layout.layout2);
}

layout1.xml

<Button
    android:id="@+id/someBtn1"
    android:onClick="setLayout2"/>

layout2.xml

<Button
    android:id="@+id/someBtn2"
    android:onClick="setLayout1"/>

但是,如果您想要遵循最佳實踐,最佳做法不是在同一活動中混合布局,而是聲明兩個不同的活動(每個活動都有自己的布局)並根據按鈕調用一個活動或另一個活動。點擊。 假設您在Activity1中並想要調用Activity2,然后返回到Activity1:

Activity1.java

someBtn1.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
         startActivity(new Intent(this, Activity2.class));
     }
 });

Activity2.java

someBtn2.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
         finish();
     }
 });

一種方法是在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();

在回調layout1時,必須再次設置數據。

您可以將兩個布局合並為一個,然后使用ViewFlipper在它們之間切換。

當您設置layout2時,您還應該將OnClickListener設置為someBtn1,反之亦然,我建議這樣的事情。 但正如在prevoius回答中一般,你應該避免以這種方式混合布局。

public class MainActivity extends Activity {

    private final View.OnClickListener setLayout1Listener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           setContentView(R.layout.layout2);
           ((Button)findViewById(R.id.Btn2Id)).setOnClickListener(setLayout2Listener);
           //do other stuff
        }
    };

    private final View.OnClickListener setLayout2Listener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           setContentView(R.layout.layout1);
           ((Button)findViewById(R.id.Btn1Id)).setOnClickListener(setLayout1Listener);
           //do other stuff
        }
    };



    @Override
    public void onCreate(final Bundle savedInstance) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout1);
        ((Button)findViewById(R.id.Btn1Id)).setOnClickListener(setLayout1Listener);
        //do other stuff
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM