2014-04-13 15 views
6

Tôi đang học phát triển Android. Tôi bị kẹt ở một cái gì đó nên rất dễ dàng.android.support.v4.app.FragmentManager HOẶC android.app.FragmentManager?

Tạo ứng dụng với một Hoạt động, 2 đoạn và 1 giao diện.

Vì vậy, trong hoạt động chính Cố gắng tạo tham chiếu đến Phân đoạn B bằng trình quản lý. Tôi gặp khó khăn ở đây, bởi vì Eclispse là nói cho tôi thay đổi một số thứ (xem dưới đây):

tăng thêm của tôi: `

@Override 
    public void respond(int i) { 
     // TODO Auto-generated method stub 

    FragmentManager manager =getFragmentManager(); 
    FragmentB f2= (FragmentB) manager.findFragmentById(R.id.fragment2); 

}` 

Nếu tôi làm điều đó này whay tôi nhận được thông báo lỗi và cần phải thực hiện một số thay đổi. Sau khi thay đổi mã trông như thế này (và tôi vẫn không thể đạt FragmentB):

@Override 
public void respond(int i) { 
    // TODO Auto-generated method stub 

    android.app.FragmentManager manager =getFragmentManager(); 
    android.app.Fragment f2= manager.findFragmentById(R.id.fragment2); 

} 

Để biết chi tiết thêm, tôi sẽ đặt ở đây cũng là tiêu đề nhập khẩu của Hoạt động:

package com.example.modular_ui; 

import android.support.v7.app.ActionBarActivity; 
import android.support.v7.app.ActionBar; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.os.Build; 

public class MainActivity extends Activity implements Communicator{.... 

gì Tôi có bị thiếu ở đây không? toàn bộ support.v4/support.v7 là một chút khó hiểu cho tân binh.

EDIT: Sau khi thay đổi để:

import android.app.Fragment; 
import android.app.FragmentManager; 

VÀ mở rộng FragmentActivity tôi vẫn không thể tạo ra một tham chiếu đến FragmentB:

@Override 
public void respond(int i) { 
    // TODO Auto-generated method stub 

FragmentManager man = getFragmentManager(); 
FragmentB b = man.findFragmentById(R.id.fragment2); 

}

Theo yêu cầu tôi đã đăng mã FragmentB:

package com.example.modular_ui; 

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

public class FragmentB extends Fragment { 

TextView text; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    return inflater.inflate(R.layout.fragment_b, container); 
} 

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onActivityCreated(savedInstanceState); 
     text = (TextView) getActivity().findViewById(R.id.textView1); 
    } 

XML Main

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.modular_ui.MainActivity" 
    tools:ignore="MergeRootFrame" > 

    <fragment 
     android:id="@+id/fragment1" 
     android:name="com.example.modular_ui.FragmentA" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <fragment 
     android:id="@+id/fragment2" 
     android:name="com.example.modular_ui.FragmentB" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/fragment1" 
     android:layout_marginTop="54dp" /> 

</RelativeLayout> 
+0

Thư viện hỗ trợ chủ yếu hỗ trợ ActionBar và một số tính năng chính khác không được hỗ trợ cho đến API 11. Nếu bạn có API tối thiểu là 11, tôi sẽ sử dụng thư viện thông thường để tránh thêm số lượng không cần thiết. Trừ khi có điều gì đó tôi không biết. – zgc7009

+0

Cảm ơn bạn đã phản hồi nhanh chóng. Eclipse tự động triển khai lib hỗ trợ. Vì vậy, bạn đề nghị thay đổi điều này thành: import android.app.Fragment; nhập android.app.FragmentManager; – Foo

+1

Bạn có thể sử dụng một trong hai, nhưng tôi không nghĩ rằng có một nhu cầu nếu bạn ở một API cao hơn 11 hoặc cao hơn như tất cả mọi thứ (mà tôi biết) được hỗ trợ với các thư viện có nguồn gốc tại thời điểm đó. Nếu đó là trường hợp nó chỉ là số lượng lớn trong ứng dụng của bạn và có thể gây ra một nhức đầu cố gắng để nhớ những gì bạn đang sử dụng. – zgc7009

Trả lời

4

Trước hết: hoạt động của bạn nên mở rộng FragmentActivity.

Giới thiệu về thư viện hỗ trợ. Họ đã được giới thiệu để thêm một số chức năng cho Android cũ hơn. Ví dụ: Các mảnh vỡ đã được giới thiệu trong Android 3.0 (SDK nr: 11). Trong thực tế (theo tài liệu) trong Androids 3.0 < hỗ trợ libary sử dụng hệ thống thực hiện các mảnh vỡ.

+1

Cảm ơn, nhưng không có succes (xem chỉnh sửa của tôi) – Foo

+0

Bạn có thể gửi mã của bạn để tạo và gắn FragmentB? Ngoài ra hoạt động chính xml sẽ rất hữu ích. – RobertM

+0

Tôi đã thêm những điều dưới – Foo

8

Chỉ cần sử dụng getSupportFragmentManager(); , sau khi bạn thêm thư viện hỗ trợ thành công.

+1

cảm ơn bạn, điều này đã giúp tôi giải quyết vấn đề! – Petro

3

OP rất gần với việc có giải pháp có thể hoạt động tốt cho API 11 và mới hơn mà không cần hỗ trợ.v4.

Anh ấy chỉ cần thay đổi Fragment của mình cũng không sử dụng support.v4, trong tuyên bố nhập.

Tóm tắt hai phương pháp tiếp cận. TẤT CẢ các Hoạt động và Phân đoạn của bạn phải có mã giống như chính xác một trong số này; đừng trộn chúng!(Không phải tất cả các dòng là cần thiết trong tất cả các file; dòng sử dụng khi cần thiết.)

hỗ trợ-v4 cách tiếp cận

import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.Fragment;  <-- ".support.v4" 
import android.support.v4.app.FragmentManager; 

... MainActivity extends FragmentActivity ... 

... = getSupportFragmentManager(); 

.... YourFragment extends Fragment ... <-- same in both approaches 

API 11 + Cách tiếp cận

import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentManager; 

... MainActivity extends Activity ... 

... = getFragmentManager(); 

.... YourFragment extends Fragment ... <-- same in both approaches 

Vì vậy, nếu bạn có một dự án được viết bằng cách sử dụng một cách tiếp cận ở trên và bạn đang tích hợp mã từ các nơi khác, hãy chắc chắn tìm kiếm se dòng, và thay đổi chúng để phù hợp với những gì bạn có.

2

Nó đơn giản.

Nếu bạn cũng muốn ứng dụng của bạn để chạy trong các thiết bị cũ (dưới mức API 11), sử dụng getSupportFragmentManager().

Nếu bạn muốn ứng dụng của mình chạy trong các thiết bị có cấp API trên 11, thì hãy sử dụng getFragmentManger().

Các vấn đề liên quan