Fragments inside LinearLayout - Android
Asked Answered
P

2

3

I'm new with fragments and I try to use these. My xml from activity is:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Loguin"
tools:ignore="MergeRootFrame">

    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Fragment Test"
    android:id="@+id/btn_FragmentTest"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="20dp"
    android:layout_marginBottom="0dp" />

    <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="horizontal"
    android:id="@+id/frgContainer"
    android:layout_marginTop="20dp">

    <fragment
        android:id="@+id/frgLoguin"
        android:layout_marginTop="20dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="habitatprojects.hubbuildings.Loguin$PlaceholderFragment"
        tools:layout="@layout/fragment_loguin" />

    </LinearLayout>



</LinearLayout>

And I want to change the fragment inside of LinearLayout, my class of mainActivity is:

public class Loguin extends Activity {

private int num = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_loguin);
    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }

    Button btnBoton1 = (Button)findViewById(R.id.btn_FragmentTest);

    btnBoton1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0)
        {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            if(num==0)
            {
                fragmentTransaction.replace(R.id.frgContainer, new PlaceholderFragment())
                        .commit();

                num++;
            }
            else{
                if(num==1)
                {
                    fragmentTransaction.replace(R.id.frgContainer, new PlaceholderFragment2())
                            .commit();

                    num++;
                }
                else{
                    fragmentTransaction.replace(R.id.frgContainer, new PlaceholderFragment3())
                            .commit();

                    num = 0;
                }
            }
        }
    });
 }

And my PlaceHolderFunctions are:

public static class PlaceholderFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_loguin, container, false);
    }
}

public static class PlaceholderFragment2 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return  inflater.inflate(R.layout.fragment_blank, container, false);
    }
}

public static class PlaceholderFragment3 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_blank2, container, false);
    }
}

Why doesn't work when I press the button? What do I doing bad? Srry for my english and thanks in advance!

PD: If you need more code or info advise me, thanks!

PD1: When I debug with my device the log cat just say me:

11-18 11:33:30.775 6065-6065/habitatprojects.hubbuildings I/ViewRootImpl﹕ ViewRoot's Touch Event : Touch Down 11-18 11:33:30.835 6065-6065/habitatprojects.hubbuildings I/ViewRootImpl﹕ ViewRoot's Touch Event : Touch UP

Peloria answered 18/11, 2014 at 10:23 Comment(2)
What is the expacted behavior and what do your get? If you get an Exception please add the stack trace form logcat.Holster
Thanks simulant you have my LogCat in post now! No errors... :DMossman
P
0

Solved I just need to change my LinearLayout for FrameLayout! Thanks for all!

Peloria answered 18/11, 2014 at 11:8 Comment(3)
can't LinearLayout be a container ?Colonnade
Sure, but then you FragmentTransaction.add() to it.Ornithine
It works perfectly with LinearLayoutKandrakandy
K
0

It's this easy:

It's very likely your main activity would look like this. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:id="@+id/your_vertical_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    </LinearLayout>
</ScrollView>

Say you have a fragment OneRow .

Here's how you would add three rows.

private void addRows() {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.your_vertical_list, new OneRow());
    ft.add(R.id.your_vertical_list, new OneRow());
    ft.add(R.id.your_vertical_list, new OneRow());
    ft.commit();
}

Note that in .add you simply pass in the layout id, R.id.your_vertical_list.

Normally you'd need the rows, hence

public class MainActivity extends AppCompatActivity {

    ArrayList<OneRow> rows = new ArrayList<OneRow>();

    private void addRows() {
        FragmentTransaction ft =
          getSupportFragmentManager().beginTransaction();
        for (int i = 0; i < 20; i++) {
            OneRow r = new OneRow();
            rows.add(r);
            ft.add(R.id.your_vertical_list, r);
        }
        ft.commit();
    }

However. Note that it's usually better to commit for each item, especially if you are setting any text labels etc. For example

    private void addRows() {
        for (int i = 0; i < 20; i++) {
            FragmentTransaction ft =
              getSupportFragmentManager().beginTransaction();
            OneRow r = new OneRow();
            r.set
            rows.add(r);
            ft.add(R.id.your_vertical_list, r);
            ft.commit();
        }
    }
Kandrakandy answered 19/6, 2022 at 14:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.