1

really in need of some advice, dont know what is wrong here.

Context: 2 fragments with a Textview each and the main activity has 2 button and a edittext

Aim: Type hello into the edittext box in the main activity and When click on the button for fragment 1, the textview will change to hello.

Problem:

Face a runtime error when enter hello into edittext and click on button 1.

Logcat:

E/AndroidRuntime(1291): FATAL EXCEPTION: main
E/AndroidRuntime(1291): android.view.InflateException: Binary XML file line #29: Error inflating class fragment
E/AndroidRuntime(1291): android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
E/AndroidRuntime(1291):android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
E/AndroidRuntime(1291):android.view.LayoutInflater.inflate(LayoutInflater.java:489)
E/AndroidRuntime(1291): android.view.LayoutInflater.inflate(LayoutInflater.java:396)
E/AndroidRuntime(1291): com.example.FragmentOne.onCreateView(FragmentOne.java:19)
E/AndroidRuntime(1291):android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829)

fragment_one.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   android:background="#00ffff">

 <TextView
       android:id="@+id/textView1"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_weight="1"
       android:text="This is fragment No.1"
       android:textStyle="bold" />
 </LinearLayout>

activity_main.xml

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/easy"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10" >

            <requestFocus />
        </EditText>

        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="selectFrag"
            android:text="Fragment No 1" />

        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="selectFrag"
            android:text="Fragment No 2" />

        <fragment
            android:name="com.example.FragmentTwo"
            android:id="@+id/fragment_place"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </LinearLayout>

MainActivity.java

public class MainActivity extends Activity {

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

    public void selectFrag(View view) {
        Fragment fr;    
        if(view == findViewById(R.id.button2)) {
            fr = new FragmentTwo();

        }else {
            fr = new FragmentOne();
        }
        FragmentManager fm = getFragmentManager();
        FragmentTransaction fragmentTransaction = fm.beginTransaction();
        fragmentTransaction.replace(R.id.fragment_place, fr);
        fragmentTransaction.commit();

   }

}

FragmentOne.java

public class FragmentOne extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) 
    {
        View view = inflater.inflate(R.layout.fragment_one, container, false);
        TextView monthlypayment=  (TextView) view.findViewById(R.id.textView1);
        EditText easy = (EditText) inflater.inflate(R.layout.activity_main, container, false).findViewById(R.id.easy);
        monthlypayment.setText(easy.getText().toString());

        return view;
    }
}
lonelearner
  • 1,637
  • 4
  • 14
  • 22
  • You have the fragment in xml but you also add it to the container programatically. You don't have a container in fact – Raghunandan Mar 26 '14 at 17:04

2 Answers2

3

There are two ways you can add a fragment to the activity layout:

  1. Declare the fragment inside the activity's layout file.

  2. Programmatically add the fragment to an existing ViewGroup.

Both methods are mentioned in the docs

http://developer.android.com/guide/components/fragments.html

If you want add the fragment to a container you need to use a ViewGroup in xml. Generally FrameLayout is used. So have the below in xml

 <FrameLayout
        android:id="@+id/fragment_place"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

The Activity code is fine. On Button click you replace the appropriate fragment in the container.

In your Fragment onCreateView you inflate the fragment layout and use the view object to initialize views of that layout. But you inflate activity_main.xml which is not required.

Quoting docs

Specifically, the fragment can access the Activity instance with getActivity() and easily perform tasks such as find a view in the activity layout

So for EditText you can use

EditText easy = (EditText)getActivity().findViewById(R.id.easy);

Or Initialize EditText in Activity on Button click get the value from EditTextand then you can pass the value of EditText from Activity to Fragment

Send data from activity to fragment in android

Community
  • 1
  • 1
Raghunandan
  • 132,755
  • 26
  • 225
  • 256
  • Dear Sir, thank you for the comment. It not only solve the bug. But it also explain very clearly what a fragment is and how to manipulate things across fragments. Thank you very much. – lonelearner Mar 27 '14 at 14:57
0

show me the onclick method, and the container u have fragment one in... its one of two things,

either you are programmatically adding a view which already exists, or you are tryin to update the ui without a handler.... handlers can be worked around in fragments, so im assuming its the first one....

Technivorous
  • 1,682
  • 2
  • 16
  • 22