I am aware of the following post: Using Multiple Fragments in an single activity
What I am looking for is a specific answer to a specific problem. The result of the following code is a blank FragmentActivity. What am I missing in my following code to get it to render an activity with two fragments. One is a empty list fragment, the other is a fragment which contains a input box and a button in a horizontal layout, (this layout can be found at http://developer.android.com/training/basics/firstapp/starting-activity.html) that I want to be placed absolutely at the bottom of the screen with a fixed height of about 25 dip.
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.package"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.my.package.Application"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
My main activity and its associated application.xml file.
package com.my.package;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
public class Application
extends FragmentActivity
implements MessageListViewFragment.OnLineSelectedListener,
SendMessageFragment.OnSendButtonPressed {
MessageListViewFragment mMessageListFragment;
SendMessageFragment mSendMessageFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.application);
mMessageListFragment = new MessageListViewFragment();
mSendMessageFragment = new SendMessageFragment();
FragmentTransaction transaction =
getSupportFragmentManager().beginTransaction();
transaction.add(R.id.message_fragment, mMessageListFragment);
transaction.add(R.id.send_fragment, mSendMessageFragment);
transaction.commit();
}
@Override
public void onListItemSelected(int position) {
// TODO Auto-generated method stub
}
@Override
public void onSendButtonPressed() {
// TODO Auto-generated method stub
}
}
Layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="vertical" >
<fragment
android:id="@+id/message_fragment"
android:name="com.example.android.fragments.MessageListViewFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="top" />
<fragment
android:id="@+id/send_fragment"
android:name="com.example.android.fragments.SendMessageFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="bottom" />
</LinearLayout>
And now for the two fragments and their associated xml files: First Fragment (list fragment at top)
package com.my.package;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MessageListViewFragment extends ListFragment {
OnLineSelectedListener mCallback;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnLineSelectedListener)activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnLineSelectedListener");
}
}
// Container Activity must implement this interface
public interface OnLineSelectedListener {
public void onListItemSelected(int position);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.list_fragment, null);
}
}
Layout:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
second fragment (at bottom)
package com.my.package;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class SendMessageFragment extends Fragment {
OnSendButtonPressed mCallback;
// Container Activity must implement this interface
public interface OnSendButtonPressed {
public void onSendButtonPressed();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.input_fragment, null);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnSendButtonPressed)activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
}
Layout:
<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">
<EditText android:id="@+id/edit_message"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send" />
</LinearLayout>
You can use multiple instances of the same fragment class within the same activity, in multiple activities, or even as a child of another fragment.
You can use as many layouts as possible for a single activity but obviously not simultaneously. You can use something like: if (Case_A) setContentView(R. layout.
In one fragment activity, call a method and pass a variable to the main activity. From the main activity you can send it to your other fragment activity if you'd like. Show activity on this post. You can also use SharedPreferences to save some string and after return back to the first fragment load it and clear.
Do the following:
Fragment
to FrameLayout
in the main activity XML, for both.layout_width
from fill_parent
to match_parent
, for both FrameLayout
in the main XML file, (ones created in step 1).layout_height
from fill_parent
to wrap_content
, for both FrameLayout
in the main XML file, (ones created in step 1).FrameLayout
to ListView
in the List Fragment XML because it is a List.LisView
to @android:id/list
, because it is needed for the ListFragment
.Then let me know, Cheers.
Edit, also these:
return inflater.inflate(R.layout.list_fragment, null);
to return inflater.inflate(R.layout.list_fragment, container, false);
.return inflater.inflate(R.layout.input_fragment, null);
to return inflater.inflate(R.layout.input_fragment, container, false);
Edit:
Make your main activity XML file like this:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/message_fragment" android:layout_width="match_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@+id/send_fragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" /> </RelativeLayout>
I took out the android:name"..."
because I don't know what that is nor able to find out what it is, if you know what it does for sure, just add it back, should be okay.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With