2012-03-22 37 views
23

Tôi muốn khởi chạy một đoạn mới để xem một số dữ liệu. Hiện tại, tôi có một hoạt động chính có một loạt các thanh tác vụ, mỗi tab trong số đó là một đoạn. Vì vậy, trong một đoạn tab, tôi có một nút, chartsButton. Tôi có OnClickListener của tôi tất cả thiết lập cho nó, và đây là phương pháp onClick:Bắt đầu một đoạn qua Intent trong một Fragment

public OnClickListener chartsListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     Intent chartFragment = new Intent(); 
     startActivity(chartFragment); 
    } 
}; 

Bây giờ, như tôi đã nói, người nghe đây là trong một lớp học kéo dài Fragment. Vì vậy, tôi muốn khởi chạy một mảnh mới (chartsFragment) thông qua ý định thay thế toàn bộ màn hình. Khi người dùng nhấp lại, nó sẽ đưa họ trở lại các tab và hoạt động chính. Dưới đây là đoạn biểu đồ của tôi:

public class chartsFragment extends Fragment { 

    public View onCreateView() { 
     //LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState 
     LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     return (inflater.inflate(R.layout.chartfragment, null)); 
    } 
} 

Các lỗi hiện tại tôi đang đối phó với: "android.content.ActivityNotFoundException: Không Hoạt động phát hiện để xử lý Ý định {}". Đó là tốt, tôi hiểu rằng tôi có thể sử dụng getActivity(). StartActivity (chartsFragment), nhưng kết quả trong cùng một lỗi. Tôi cho rằng những gì tôi đang tìm kiếm ở đây, là làm thế nào để tôi khởi động một ý định từ bên trong một đoạn mà kết quả trong việc mở một đoạn mới?

Trả lời

16

Bạn không thể mở các đoạn mới. Các mảnh cần phải luôn được lưu trữ bởi một hoạt động. Nếu đoạn nằm trong cùng một hoạt động (ví dụ như các tab) thì điều hướng chính quay lại sẽ phức tạp, tôi giả định rằng bạn muốn mở một màn hình mới với đoạn đó.

Vì vậy, bạn chỉ cần tạo một hoạt động mới và đặt đoạn mới vào đó. Hoạt động đó sau đó sẽ phản ứng với mục đích hoặc rõ ràng thông qua lớp hoạt động hoặc ngầm qua intent filter s.

+0

này đã làm việc một cách hoàn hảo. Tôi vừa tạo ra một lớp mới có tên là Chart, nó mở rộng Activity, đặt nó vào Manifest, và nó đã tải bố cục xml mà tôi đã dự định cho một đoạn. Các chức năng trở lại hoạt động như tôi mong muốn quá. Cám ơn rất nhiều! – Davek804

+0

@ Davek804 bạn có thể cập nhật mã bằng giải pháp không, vui lòng –

+0

@ Davek804 Bạn có thể giải thích bằng biểu đồ hoặc mã không ?? – DroidLearner

49

Câu trả lời cho vấn đề của bạn thật dễ dàng: thay thế Fragment hiện tại bằng Fragment mới và đẩy giao dịch vào hậu trường. Điều này bảo tồn hành vi nút quay lại ...

Tạo mới Activity thực sự đánh bại toàn bộ mục đích sử dụng phân đoạn dù sao ... rất phản tác dụng.

@Override 
public void onClick(View v) { 
    // Create new fragment and transaction 
    Fragment newFragment = new chartsFragment(); 
    // consider using Java coding conventions (upper first char class names!!!) 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

    // Replace whatever is in the fragment_container view with this fragment, 
    // and add the transaction to the back stack 
    transaction.replace(R.id.fragment_container, newFragment); 
    transaction.addToBackStack(null); 

    // Commit the transaction 
    transaction.commit(); 
} 

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

+2

Công việc của nó chỉ khi cả hai mảnh được lưu trữ bởi cùng một hoạt động – androidXP

+0

Có thể, nhưng tại sao điều đó đáng chú ý? Tôi chỉ có một hoạt động trong tất cả các ứng dụng của mình. Đó là loại toàn bộ vấn đề không phải là nó; hạn chế số lượng hoạt động? – slinden77

5

Hãy thử điều này nó có thể giúp bạn:

public void ButtonClick(View view) { 
    Fragment mFragment = new YourNextFragment(); 
    getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mFragment).commit(); 
} 
0

Hãy thử điều này nó có thể giúp bạn:

private void changeFragment(Fragment targetFragment){ 

    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.main_fragment, targetFragment, "fragment") 
     .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE) 
     .commit(); 

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