2013-04-16 7 views
10

DÜZENLEMEYİ Fragments nasıl kullanılır ::: ... aşağıda benim cevabını bakınAndroid'de

Soru :::

Ben Android'de Fragments kullanmaya çok yeni ve tamamen berbat ediyorum.

Sadece Fragments kullanan basit bir örnek uygulama oluşturmaya çalışıyorum. Benim senaryoda, ana faaliyetimde iki parçam var. İlk parçanın bir edittext ve bir düğmesi vardır. İkinci bölümün bir metin görüşü vardır. Edittext içine bir isim girdiğimde ve butona tıkladığımda, ikinci fragmandaki metin görünümü, ilk fragmanın edittextinde girilen ismi göstermelidir.

Parçaların statik atamasını kullanıyorum (XML'de parça atayarak).

activity_main.XML ... XML dosyaları ve aşağıdaki Kanunu bakınız

<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 Dosyalar :::

MainActivity.Java Uygulamayı çalıştırdığınızda

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); 
    } 

} 

, sürü vardır istisnalar .. İşte logcat iz ..

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 

Nasıl yapılacağına dair örnekler gördüm, ancak bunu anlayamadım. Lütfen yanlış yaptığım bölgeleri işaretleyin ve lütfen doğru yolu yazınız.

teşekkürler kez bir sürü ...

DÜZENLEME ::: yerine Faaliyet FragmentActivity uzatmak MainActivity.java değişti ve ayrıca android değişti

: activity_main ad değerlerini. xml ... Java Files yerine parçaların için

işaret etmek alıyorum aşağıdaki istisnalar :::

İşte
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 

değişti XML Fil olduğunu activity_main alanının e.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 ScreenShot olduğunu /AndroidFragments/article.html http://developer.android.com/training/basics/fragments/creating.html – Triode

+0

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

cevap

11

Okie ... Sonunda bir çözüm buldu. Muhtemelen, bu bir değişiklik değildi.

Kontrol dışarı aşağıdaki kodu ...

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> 

fragment_fragment_1 ve fragment_fragment_2 düzenleri aynı kalır.

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 İşte

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); 
    } 

} 

...

enter image description here

+1

Ama 'parça' unsuru 'boş bir etiket' değil midir? Ayrıca sizin durumunuzda nasıl çalıştığını merak ediyorum, sadece tüm kodunuzu kopyaladım ve hala bu hataları alıyorum. – mr5

+0

Fragment'ın tanımı konusunda kafam karıştı mı? Http://developer.android.com/guide/components/fragments.htmlreading sitesinden okumak bile Fragment hakkında hiçbir şey anlamadım, lütfen çok basit bir şekilde Fragmanlar nedir tanımlayabilirsiniz? –

1

Bunu yığın izleme diyor gibi, Fragments için boş kamu yapıcı eklemeniz gerekir:

public class Fragment_2 extends Fragment{ 

    public Frament_2() { 
     //BLAH! 
    } 

    // The rest of your code 

} 
+0

Yapıcıyı ekledim. Özel Durumda Değişiklik Yok ... Yapıcı –

+0

'u eklemek için aynı özel durumu anladım. Sadece bir şey farkettim, fragmanları görüntülemek için FragmentActivity öğesini genişletmeniz gerekmez mi? – Cornholio

+0

FragmentActivity olarak değiştirildi, Soruyu güncelleştirin, lütfen bir göz atın –

0

şöyle AS activity_main.XML düzenleyin.

<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> 
İlgili konular