Reputation: 167
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
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
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
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
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