Digital Da
Digital Da

Reputation: 911

Fragment won't show in Activity

I am trying to create a screen that will have a fragment with 3 buttons and underneath it a text frame but am not seeing anything when I ran the app. I am new to Android so I assume I am missing something basic. What am I missing?

Edit: Thank you for all the answers. The problem ended up being that the buttons were of invisible size. The activity did load the fragment, without the need to call the fragment manager.

Oh, the joys of learning a new framework :)

Thank you!

activity_main.xml

<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">

<fragment
    android:id="@+id/buttons"
    android:layout_width="match_parent"
    android:layout_height="400dp"
    class="com.thenoisemargins.eyaldagiavdor.thisdaybefore.ButtonsFragment" />

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp">

    <TextView
        android:layout_width="48dp"
        android:layout_height="45dp"
        android:id="@+id/historicalQuoteTextView"
        android:layout_gravity="center_vertical"
        android:textAlignment="center"
        android:textColor="#FFFFFFFF"
        android:text="Quote"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</FrameLayout>

buttons_fragment.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<at.markushi.ui.CircleButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:text="@string/this_day_before"
    android:id="@+id/thisDayBeforeButton"
    app:cb_color="#99CC00"
    app:cb_pressedRingWidth="8dip" />

<at.markushi.ui.CircleButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:text="@string/choose_date"
    android:id="@+id/ChooseDateButton"
    app:cb_color="#99CC00"
    app:cb_pressedRingWidth="8dip" />

<at.markushi.ui.CircleButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:text="@string/random_date"
    android:id="@+id/RandomDateButton"
    app:cb_color="#99CC00"
    app:cb_pressedRingWidth="8dip" />
</LinearLayout>

MainActivity.java

public class MainActivity extends ActionBarActivity {

    private ButtonsFragment mFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /*
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        mFragment =  new ButtonsFragment();
        fragmentTransaction.add(R.id.buttons, mFragment);
        fragmentTransaction.commit();
               */

        mFragment = (ButtonsFragment) getFragmentManager()
                .findFragmentById(R.id.buttons);


    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

ButtonsFragment.java

public class ButtonsFragment extends Fragment {

private at.markushi.ui.CircleButton mThisDayBeforeButton;
private at.markushi.ui.CircleButton mChooseDateButton;
private at.markushi.ui.CircleButton mRandomDateButton;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.buttons_fragment, container, false);



    return rootView;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    mThisDayBeforeButton = (at.markushi.ui.CircleButton) getActivity().findViewById(R.id.thisDayBeforeButton);
    mChooseDateButton = (at.markushi.ui.CircleButton) getActivity().findViewById(R.id.ChooseDateButton);
    mRandomDateButton = (at.markushi.ui.CircleButton) getActivity().findViewById(R.id.RandomDateButton);

}

}

Upvotes: 1

Views: 1521

Answers (3)

Harin
Harin

Reputation: 2423

If you want to show fragment directly in xml then,

<fragment
android:id="@+id/buttons"
android:layout_width="match_parent"
android:layout_height="400dp"
class="com.thenoisemargins.eyaldagiavdor.thisdaybefore.ButtonsFragment" />

Or if you want to display programmatically, you need to use

getSupportFragmentManager()

because you are using ActionbarActivity, like: add framelayou with id 'frame' (example) in layout and then add this code to your activity

FrameLayout f = (FrameLayout) findViewById(R.id.fram);
    getSupportFragmentManager().beginTransaction().replace(R.id.fram, new ButtonsFragment()).commit();

Hope this helped!

Upvotes: 0

Mansukh Ahir
Mansukh Ahir

Reputation: 3563

Try this if work

FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            mFragment =  new ButtonsFragment();
            fragmentTransaction.add(R.id.buttons, mFragment);
            fragmentTransaction.commit();

Above code replace with this and try may be work.

FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.buttons, fragment).commit();

Upvotes: 0

Navjot Singh
Navjot Singh

Reputation: 514

remove comment on given section. You will have to add the fragment in the fragmentManager using fragmentTransaction in order to view fragment.

  mFragment = (ButtonsFragment) getFragmentManager()
                .findFragmentById(R.id.buttons);

            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            mFragment =  new ButtonsFragment();
            fragmentTransaction.add(R.id.buttons, mFragment);
            fragmentTransaction.commit();

Upvotes: 2

Related Questions