2013-04-16 12 views
10

EDIT ::: Proszę odnieść się do mojej odpowiedzi poniżej ...Jak korzystać Fragments w Androidzie

Pytanie :::

jestem bardzo nowy w użyciu fragmentów w Androidzie i jestem całkowicie zawiedli.

Po prostu próbuję zbudować prostą przykładową aplikację, która korzysta z Fragmentów. Mój scenariusz polega na tym, że w mojej głównej działalności mam dwa fragmenty. Pierwszy fragment zawiera editekst i przycisk. Drugi fragment ma widok tekstowy. Kiedy wprowadzam nazwę w edytorze tekstu i klikam przycisk, widok tekstowy w drugim fragmencie powinien wyświetlać nazwę wprowadzoną w edytorze pierwszego fragmentu.

Używam statycznego przypisania fragmentów (przypisywanie fragmentów w XML).

Proszę zapoznać się z plikami XML i kodu poniżej ...

activity_main.XML

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

    <fragment 
     android:id="@+id/fragment_content_1" 
     android:name="com.example.fragmentexample.fragment_fragment_1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    </fragment> 

    <fragment 
     android:id="@+id/fragment_content_2" 
     android:name="com.example.fragmentexample.fragment_fragment_2" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <!-- Preview: [email protected]/fragment_basic --> 
    </fragment> 

</LinearLayout> 

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

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

     <requestFocus /> 
    </EditText> 

    <Button 
     android:id="@+id/btnSayHi" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Say Hi" /> 

</LinearLayout> 

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

    <TextView 
     android:id="@+id/txtViewResult" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="I will say Hi" /> 

</LinearLayout> 

Java Pliki :::

MainActivity.Java

package com.example.fragmentexample; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 

    public class MainActivity extends Activity { 

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

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

    } 

Fragment_1.Java

package com.example.fragmentexample; 

import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentManager; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class Fragment_1 extends Fragment{ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub  

     View view = inflater.inflate(R.layout.fragment_fragment_1, container, false); 

     final EditText edtxtPersonName_Fragment = (EditText) view.findViewById(R.id.edtxtPersonName); 
     Button btnSayHi_Fragment = (Button) view.findViewById(R.id.btnSayHi); 

     btnSayHi_Fragment.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       String name = edtxtPersonName_Fragment.getText().toString(); 

       FragmentManager fm = getFragmentManager(); 
       Fragment_2 f2 = (Fragment_2) fm.findFragmentById(R.id.fragment_content_2); 

       if(f2 != null && f2.isInLayout()) 
       { 
        f2.setName(name); 
       } 

       Activity activity = getActivity(); 

       if(activity != null) 
       { 
        Toast.makeText(activity, "Say&ing Hi in Progress...", Toast.LENGTH_LONG).show(); 
       } 
      } 
     }); 

     return view; 


    } 

} 

Fragment_2.Java

package com.example.fragmentexample; 

import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class Fragment_2 extends Fragment{ 

    View view; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     view = inflater.inflate(R.layout.fragment_fragment_2, container, false);   
     return view; 
    } 

    public void setName(String name) 
    { 
     TextView txtName = (TextView) view.findViewById(R.id.txtViewResult); 
     txtName.setText("Hi " + name); 
    } 

} 

Kiedy uruchomić aplikację, istnieje całe mnóstwo wyjątków .. Oto ślad logcat ..

04-16 15:06:48.781: E/AndroidRuntime(420): FATAL EXCEPTION: main 
04-16 15:06:48.781: E/AndroidRuntime(420): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragmentexample/com.example.fragmentexample.MainActivity}: android.view.InflateException: Binary XML file line #5: Error inflating class fragment 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.ActivityThread.access$500(ActivityThread.java:122) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.os.Looper.loop(Looper.java:132) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.ActivityThread.main(ActivityThread.java:4123) 
04-16 15:06:48.781: E/AndroidRuntime(420): at java.lang.reflect.Method.invokeNative(Native Method) 
04-16 15:06:48.781: E/AndroidRuntime(420): at java.lang.reflect.Method.invoke(Method.java:491) 
04-16 15:06:48.781: E/AndroidRuntime(420): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
04-16 15:06:48.781: E/AndroidRuntime(420): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
04-16 15:06:48.781: E/AndroidRuntime(420): at dalvik.system.NativeStart.main(Native Method) 
04-16 15:06:48.781: E/AndroidRuntime(420): Caused by: android.view.InflateException: Binary XML file line #5: Error inflating class fragment 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.view.LayoutInflater.rInflate(LayoutInflater.java:724) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.view.LayoutInflater.inflate(LayoutInflater.java:479) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.view.LayoutInflater.inflate(LayoutInflater.java:391) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.view.LayoutInflater.inflate(LayoutInflater.java:347) 
04-16 15:06:48.781: E/AndroidRuntime(420): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.Activity.setContentView(Activity.java:1786) 
04-16 15:06:48.781: E/AndroidRuntime(420): at com.example.fragmentexample.MainActivity.onCreate(MainActivity.java:12) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.Activity.performCreate(Activity.java:4397) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779) 
04-16 15:06:48.781: E/AndroidRuntime(420): ... 11 more 
04-16 15:06:48.781: E/AndroidRuntime(420): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.example.fragmentexample.fragment_fragment_1: make sure class name exists, is public, and has an empty constructor that is public 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.Fragment.instantiate(Fragment.java:567) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.Fragment.instantiate(Fragment.java:535) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.Activity.onCreateView(Activity.java:4168) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664) 
04-16 15:06:48.781: E/AndroidRuntime(420): ... 21 more 
04-16 15:06:48.781: E/AndroidRuntime(420): Caused by: java.lang.ClassNotFoundException: com.example.fragmentexample.fragment_fragment_1 in loader dalvik.system.PathClassLoader[/data/app/com.example.fragmentexample-1.apk] 
04-16 15:06:48.781: E/AndroidRuntime(420): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:251) 
04-16 15:06:48.781: E/AndroidRuntime(420): at java.lang.ClassLoader.loadClass(ClassLoader.java:540) 
04-16 15:06:48.781: E/AndroidRuntime(420): at java.lang.ClassLoader.loadClass(ClassLoader.java:500) 
04-16 15:06:48.781: E/AndroidRuntime(420): at android.app.Fragment.instantiate(Fragment.java:557) 
04-16 15:06:48.781: E/AndroidRuntime(420): ... 24 more 

Widziałem przykłady, jak to zrobić, ale nie mogłem tego rozgryźć. Wskaż obszary, w których robię to źle, a także opublikuj poprawny sposób robienia tego.

dziękuję za poświęcony czas ...

EDIT :::

Zmieniłem MainActivity.java przedłużyć FragmentActivity zamiast aktywności, a także zmienił android: wartości nazwisko w activity_main. xml, aby wskazywały pliki Java zamiast fragmentów ...

uzyskać następujące wyjątki :::

04-16 15:29:43.821: E/AndroidRuntime(563): FATAL EXCEPTION: main 
04-16 15:29:43.821: E/AndroidRuntime(563): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragmentexample/com.example.fragmentexample.MainActivity}: android.view.InflateException: Binary XML file line #5: Error inflating class fragment 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.app.ActivityThread.access$500(ActivityThread.java:122) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.os.Looper.loop(Looper.java:132) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.app.ActivityThread.main(ActivityThread.java:4123) 
04-16 15:29:43.821: E/AndroidRuntime(563): at java.lang.reflect.Method.invokeNative(Native Method) 
04-16 15:29:43.821: E/AndroidRuntime(563): at java.lang.reflect.Method.invoke(Method.java:491) 
04-16 15:29:43.821: E/AndroidRuntime(563): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
04-16 15:29:43.821: E/AndroidRuntime(563): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
04-16 15:29:43.821: E/AndroidRuntime(563): at dalvik.system.NativeStart.main(Native Method) 
04-16 15:29:43.821: E/AndroidRuntime(563): Caused by: android.view.InflateException: Binary XML file line #5: Error inflating class fragment 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.view.LayoutInflater.rInflate(LayoutInflater.java:724) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.view.LayoutInflater.inflate(LayoutInflater.java:479) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.view.LayoutInflater.inflate(LayoutInflater.java:391) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.view.LayoutInflater.inflate(LayoutInflater.java:347) 
04-16 15:29:43.821: E/AndroidRuntime(563): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.app.Activity.setContentView(Activity.java:1786) 
04-16 15:29:43.821: E/AndroidRuntime(563): at com.example.fragmentexample.MainActivity.onCreate(MainActivity.java:13) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.app.Activity.performCreate(Activity.java:4397) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779) 
04-16 15:29:43.821: E/AndroidRuntime(563): ... 11 more 
04-16 15:29:43.821: E/AndroidRuntime(563): Caused by: java.lang.ClassCastException: com.example.fragmentexample.Fragment_1 cannot be cast to android.support.v4.app.Fragment 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.support.v4.app.Fragment.instantiate(Fragment.java:394) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.support.v4.app.Fragment.instantiate(Fragment.java:369) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:272) 
04-16 15:29:43.821: E/AndroidRuntime(563): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:660) 
04-16 15:29:43.821: E/AndroidRuntime(563): ... 21 more 

Oto zmienił XML Fil e of activity_main.xml

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

    <fragment 
     android:id="@+id/fragment_content_1" 
     android:name="com.example.fragmentexample.Fragment_1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    </fragment> 

    <fragment 
     android:id="@+id/fragment_content_2" 
     android:name="com.example.fragmentexample.Fragment_2" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <!-- Preview: [email protected]/fragment_basic --> 
    </fragment> 

</LinearLayout> 
+0

http://www.vogella.com/articles /AndroidFragments/article.html http://developer.android.com/training/basics/fragments/creating.html – Triode

+0

Patrz [tutaj] (http://v4all123.blogspot.com/2013/07/simple-fragments-tutorial.html). – Gunaseelan

Odpowiedz

11

Okie ... W końcu znalazłem rozwiązanie. Prawdopodobnie nie była to żadna zmiana.

Sprawdź poniższy kod ...

activity_main.XML

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

    <fragment 
     android:id="@+id/fragment_content_1" 
     android:name="com.example.fragmentexample.Fragment_1" 
     android:layout_width="0dip" 
     android:layout_weight="0.50" 
     android:layout_height="fill_parent" > 
    </fragment> 

    <fragment 
     android:id="@+id/fragment_content_2" 
     android:name="com.example.fragmentexample.Fragment_2" 
     android:layout_width="0dip" 
     android:layout_weight="0.50" 
     android:layout_height="fill_parent" > 

     <!-- Preview: [email protected]/fragment_basic --> 
    </fragment> 

</LinearLayout> 

Te układy fragment_fragment_1 i fragment_fragment_2 pozostają takie same.

Fragment_1.Java

package com.example.fragmentexample; 

import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentManager; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class Fragment_1 extends Fragment{ 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      // TODO Auto-generated method stub  

      View view = inflater.inflate(R.layout.fragment_fragment_1, container, false); 

      final EditText edtxtPersonName_Fragment = (EditText) view.findViewById(R.id.edtxtPersonName); 
      Button btnSayHi_Fragment = (Button) view.findViewById(R.id.btnSayHi); 

      btnSayHi_Fragment.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 

        String name = edtxtPersonName_Fragment.getText().toString(); 

        FragmentManager fm = getFragmentManager(); 
        Fragment_2 f2 = (Fragment_2) fm.findFragmentById(R.id.fragment_content_2); 

        if(f2 != null && f2.isInLayout()) 
        { 
         f2.setName(name); 
        } 

        Activity activity = getActivity(); 

        if(activity != null) 
        { 
         Toast.makeText(activity, "Say&ing Hi in Progress...", Toast.LENGTH_LONG).show(); 
        } 
       } 
      }); 

      return view; 


     } 

    } 

Fragment_2.Java

package com.example.fragmentexample; 

import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class Fragment_2 extends Fragment{ 

    View view; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     view = inflater.inflate(R.layout.fragment_fragment_2, container, false);   
     return view; 
    } 

    public void setName(String name) 
    { 
     TextView txtName = (TextView) view.findViewById(R.id.txtViewResult); 
     txtName.setText("Hi " + name); 
    } 

} 

Oto zrzut ekranu ...

enter image description here

+1

Ale czy element 'fragment' nie jest' pustym znacznikiem'? Zastanawiam się też, jak to działa w twoim przypadku, po prostu skopiuję - wkleiłem cały twój kod i wciąż dostaję te błędy. – mr5

+0

Jestem nieco zdezorientowany definicją Fragmentu? Nawet czytanie z głównej strony http://developer.android.com/guide/components/fragments.htmlreading nie rozumiałem nic na temat Fragmentu, czy możesz w bardzo prosty sposób zdefiniować fragmenty? –

1

Trzeba dodać pustego konstruktora publicznego do fragmentów, jak mówi w ślad stosu:

public class Fragment_2 extends Fragment{ 

    public Frament_2() { 
     //BLAH! 
    } 

    // The rest of your code 

} 
+0

Dodałem konstruktora. Brak zmiany w wyjątku ... Dostaję ten sam wyjątek, aby dodać konstruktora. –

+0

Widzę ... Właśnie zauważyłem coś, czy nie trzeba rozszerzać FragmentActivity, aby wyświetlać fragmenty? – Cornholio

+0

Zmieniono go na FragmentActivity, Zaktualizowano pytanie, proszę spojrzeć na: –

0

Zedytuj activity_main.XML AS następująco.

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

<fragment 
    android:id="@+id/fragment_content_1" 
    android:name="com.example.fragmentexample.fragment_fragment_1" 
    class="com.example.fragmentexample.fragment_fragment_1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
</fragment> 

<fragment 
    android:id="@+id/fragment_content_2" 
    android:name="com.example.fragmentexample.fragment_fragment_2" 
    class="com.example.fragmentexample.fragment_fragment_2" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <!-- Preview: [email protected]/fragment_basic --> 
</fragment> 
</LinearLayout> 
Powiązane problemy