如何在android中动态设置布局

iam*_*der 14 java android android-intent android-layout

好吧,假设有一个名为MainActivity的Activity ,有两个名为layout1layout2的布局都有几个按钮.默认情况下,MainActivity布局是layout1,如下所示:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout1);
Run Code Online (Sandbox Code Playgroud)

现在我所做的实际上是通过单击layout1中的按钮,第二个布局设置如下:

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

layout2中有另一个按钮返回layout1,如下所示:

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

问题是当我返回到layout1然后someBtn1的OnClickListener不起作用.看来我需要再次设置OnClickListener someBtn1布局1.我如何编写代码以使它们与最佳实践完美配合?

spa*_*ici 24

最佳做法是使用片段而不是更改内容视图.

在您的代码中,带有布局的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);
Run Code Online (Sandbox Code Playgroud)

听众将是:

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);
    }
});
Run Code Online (Sandbox Code Playgroud)


Pio*_*zan 5

如果您只想使用当前代码,那么问题的解决方案是在布局更改时必须重新声明侦听器,如下所示:

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);
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

避免两次声明侦听器的另一种方法是声明两个方法来处理布局更改并onClick在每个布局中使用按钮的属性,例如:

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

public void setLayout2(View view) {
    setContentView(R.layout.layout2);
}
Run Code Online (Sandbox Code Playgroud)

layout1.xml:

<Button
    android:id="@+id/someBtn1"
    android:onClick="setLayout2"/>
Run Code Online (Sandbox Code Playgroud)

layout2.xml:

<Button
    android:id="@+id/someBtn2"
    android:onClick="setLayout1"/>
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要遵循最佳实践,最佳做法不是在同一活动中混合布局,而是声明两个不同的活动(每个活动都有自己的布局)并根据按钮调用一个活动或另一个活动.点击.假设您在Activity1中并想要调用Activity2,然后返回到Activity1:

Activity1.java:

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

Activity2.java:

someBtn2.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
         finish();
     }
 });
Run Code Online (Sandbox Code Playgroud)