2013-04-16 32 views
10

EDIT ::: Vui lòng tham khảo câu trả lời của tôi dưới đây ...Làm thế nào để sử dụng mảnh vỡ trong Android

Câu hỏi :::

Tôi rất mới để sử dụng mảnh vỡ trong Android và tôi hoàn toàn sai lầm.

Tôi chỉ đang cố xây dựng một ứng dụng mẫu đơn giản sử dụng Phân đoạn. Kịch bản của tôi là, tôi có hai mảnh trong hoạt động chính của mình. Đoạn đầu tiên có một văn bản và một nút. Đoạn thứ hai có một textview. Khi tôi nhập tên trong văn bản và nhấp vào nút, khung nhìn văn bản trong đoạn thứ hai sẽ hiển thị tên được nhập trong phần văn bản của đoạn đầu tiên.

Tôi đang sử dụng phân bổ tĩnh các đoạn (gán các đoạn trong XML).

Vui lòng tham khảo các tập tin XML và Mã dưới đây ...

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 tập tin :::

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

} 

Khi tôi chạy các ứng dụng, có cả nhiều ngoại lệ .. Đây là dấu vết 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 

Tôi đã xem các ví dụ về cách thực hiện, nhưng không thể hiểu được. Vui lòng chỉ các khu vực nơi tôi đang làm sai, và cũng xin vui lòng gửi đúng cách để làm điều đó.

Cảm ơn rất nhiều đã dành thời gian ...

EDIT :::

Tôi đã thay đổi MainActivity.java để mở rộng FragmentActivity thay vì hoạt động và cũng đã thay đổi android: giá trị tên trong activity_main. xml để trỏ đến file Java thay vì mảnh vỡ ...

tôi nhận được ngoại lệ sau :::

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 

đây là thay đổi XML Fil e của 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

Tham khảo [tại đây] (http://v4all123.blogspot.com/2013/07/simple-fragments-tutorial.html). – Gunaseelan

Trả lời

11

Okie ... Cuối cùng đã tìm được giải pháp. Có lẽ, nó không có nhiều thay đổi.

Kiểm tra mã dưới đây ...

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> 

Sơ đồ bố trí của fragment_fragment_1 và fragment_fragment_2 vẫn như cũ.

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

} 

Dưới đây là ảnh chụp màn hình ...

enter image description here

+1

Nhưng không phải phần tử 'fragment' là một 'thẻ trống'? Ngoài ra tôi tự hỏi làm thế nào nó hoạt động trong trường hợp của bạn, tôi chỉ cần sao chép-dán toàn bộ mã của bạn và tôi vẫn nhận được những lỗi. – mr5

+0

Tôi hơi bối rối về định nghĩa của Fragment? Ngay cả khi đọc từ trang web chính http://developer.android.com/guide/components/fragments.htmlluồng tôi không hiểu bất kỳ điều gì về Fragment, bạn có thể vui lòng xác định một cách rất đơn giản Mảnh vỡ là gì không? –

1

Bạn cần phải thêm một constructor nào trống để mảnh vỡ của bạn, giống như nó nói trong stack trace:

public class Fragment_2 extends Fragment{ 

    public Frament_2() { 
     //BLAH! 
    } 

    // The rest of your code 

} 
+0

Tôi đã thêm hàm tạo. Không có thay đổi trong trường hợp ngoại lệ ... Tôi nhận được ngoại lệ tương tự để thêm các nhà xây dựng –

+0

Tôi thấy .. Tôi chỉ nhận thấy một cái gì đó, bạn không cần phải mở rộng FragmentActivity để hiển thị các mảnh vỡ? – Cornholio

+0

Thay đổi nó thành FragmentActivity, Đã cập nhật câu hỏi, vui lòng xem –

0

Hãy chỉnh sửa activity_main.XML bạn AS như sau.

<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> 
Các vấn đề liên quan