Raül
Raül

Reputation: 167

Android - Displaying different layouts with different buttons

I have created 4 diferent <LinearLayout> and 4 different <button>. I would like to show a different layout for every button.

I have tried this:

public void changeToLinear1(View view) {
        layoutPrimer.setVisibility(View.VISIBLE);
        layoutSegon.setVisibility(View.GONE);
        layoutPostre.setVisibility(View.GONE);
        layoutExtra.setVisibility(View.GONE);
    }

public void changeToLinear2(View view) {
    layoutPrimer.setVisibility(View.GONE);
    layoutSegon.setVisibility(View.VISIBLE);
    layoutPostre.setVisibility(View.GONE);
    layoutExtra.setVisibility(View.GONE);
}

public void changeToLinear3(View view) {
    layoutPrimer.setVisibility(View.GONE);
    layoutSegon.setVisibility(View.GONE);
    layoutPostre.setVisibility(View.VISIBLE);
    layoutExtra.setVisibility(View.GONE);
}

public void changeToLinear4(View view) {
    layoutPrimer.setVisibility(View.GONE);
    layoutSegon.setVisibility(View.GONE);
    layoutPostre.setVisibility(View.GONE);
    layoutExtra.setVisibility(View.VISIBLE);
}



<Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Primers"
        android:id="@+id/btnPrimers"
        android:layout_weight="1"
        android:onClick="changeToLinear1"/>

There are 3 more buttons with different data and "onClick" calling another their respective function.

How could I manage to do this? Is there a better way?

Upvotes: 0

Views: 419

Answers (4)

Joy
Joy

Reputation: 424

A fragment is the best way to implement such functionality.

Below is code to implement a fragment and the fragment will be changed based on different button click.

Main Activity Layout:

  <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <Button
            android:id="@+id/button1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Fragment One"/>
        <Button
            android:id="@+id/button2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Fragment Two"/>
        <fragment
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            class="com.concretepage.android.FragmentOne"
            android:id="@+id/output"/>
    </LinearLayout> 

Fragment one layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="20sp"
        android:id="@+id/msg1"/>
</LinearLayout>  

Fragment two layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:gravity="center"
    android:background="#b0b0ff"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="#FF0000"
        android:textSize="20sp"
        android:id="@+id/msg2"/>
</LinearLayout> 

FragmentOne.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.cp.android.R;
public class FragmentOne extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup viewGroup, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_one, viewGroup, false);
        TextView output= (TextView)view.findViewById(R.id.msg1);
        output.setText("Fragment One");
        return view;
    }
}  

FragmentTwo.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.cp.android.R;
public class FragmentTwo extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup viewGroup, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_two, viewGroup, false);
        TextView output= (TextView)view.findViewById(R.id.msg2);
        output.setText("Fragment Two");
        return view;
    }
}  

MainActivity.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.cp.android.R;
public class MainActivity extends FragmentActivity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        OnClickListener listener = new OnClickListener() {
        public void onClick(View view) {
            Fragment fragment = null;
            if(view == findViewById(R.id.button1)){
                      fragment = new FragmentOne();
            } else {
                      fragment = new FragmentTwo();                 
            }
                        FragmentManager manager = getSupportFragmentManager();
                        FragmentTransaction transaction = manager.beginTransaction();
                        transaction.replace(R.id.output, fragment);
                        transaction.commit();
        }
         };
        Button btn1 = (Button)findViewById(R.id.button1);
        btn1.setOnClickListener(listener);
        Button btn2 = (Button)findViewById(R.id.button2);
        btn2.setOnClickListener(listener);
    }
} 

Upvotes: 1

teh_raab
teh_raab

Reputation: 394

Im going to answer since i wrote this up just as @BenP hit send.. Basically the same suggestion but to add click listeners in the activity onCreate and call a function like so..

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    findViewById(R.id.btnPrimers).setOnClickListener(view -> updateLayouts(1));
    findViewById(R.id.btnSegon).setOnClickListener(view -> updateLayouts(2));
    findViewById(R.id.btnPostre).setOnClickListener(view -> updateLayouts(3));
    findViewById(R.id.btnExtra).setOnClickListener(view -> updateLayouts(4));
}

private void updateLayouts(int layout) {
    layoutPrimer.setVisibility(layout == 0 ? View.VISIBLE : View.GONE);
    layoutSegon.setVisibility(layout == 1 ? View.VISIBLE : View.GONE);
    layoutPostre.setVisibility(layout == 2 ? View.VISIBLE : View.GONE);
    layoutExtra.setVisibility(layout == 3 ? View.VISIBLE : View.GONE);
}

Upvotes: 1

Subrata Mondal
Subrata Mondal

Reputation: 852

public void changeToLinear(int btnId) {
    layoutPrimer.setVisibility(btnId == R.id.btn1 ? View.VISIBLE : View.GONE);
    layoutSegon.setVisibility(btnId == R.id.btn2 ? View.VISIBLE : View.GONE);
    layoutPostre.setVisibility(btnId == R.id.btn3 ? View.VISIBLE : View.GONE);
    layoutExtra.setVisibility(btnId == R.id.btn4 ? View.VISIBLE : View.GONE);
}

Now, you have the onClick() method implemented:

public void onClick(View v) {
    switch(v.getId()) {
        case R.id.btn1:
        case R.id.btn2:
        case R.id.btn3:
        case R.id.btn4:
            changeToLinear(v.getId());
            break;
    }
}

Upvotes: 1

Ben P.
Ben P.

Reputation: 54194

You could have all four buttons call the same method:

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Primers"
    android:id="@+id/btnPrimers"
    android:layout_weight="1"
    android:onClick="changeToLinear"/>

<Button
    ...
    android:onClick="changeToLinear"/>

<Button
    ...
    android:onClick="changeToLinear"/>

<Button
    ...
    android:onClick="changeToLinear"/>

public void changeToLinear(View view) {
    layoutPrimer.setVisibility(view.getId() == R.id.btnPrimers ? View.VISIBLE : View.GONE);
    layoutSegon.setVisibility(view.getId() == R.id.XXXXXXX ? View.VISIBLE : View.GONE);
    layoutPostre.setVisibility(view.getId() == R.id.YYYYYYY ? View.VISIBLE : View.GONE);
    layoutExtra.setVisibility(view.getId() == R.id.ZZZZZZZ ? View.VISIBLE : View.GONE);
}

(I don't know the id of your other three buttons, but you can fill them in.)

The view argument is whatever view was tapped to trigger the click event, so you can use it to determine which button was clicked.

Upvotes: 3

Related Questions