2011-07-20 32 views
5

EDIT:bố trí với mảnh và framelayout thay thế bằng đoạn khác và framelayout

Vì vậy, sau những ý kiến ​​dưới đây, tôi revisted và nhận ra những gì đã treo tôi lên.

Hãy tưởng tượng danh sách khách hàng của tôi và các hoạt động chi tiết của khách hàng được bắt đầu bởi:

public class ClientsMainActivity extends FragmentActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //StudioTabOpenHelper db; 
     setContentView(R.layout.main_client_activity); 
    } 
} 

Vì vậy, các công trình vĩ đại này, khởi động main_client_Activity của tôi (được định nghĩa trong một bố cục bên dưới, và tôi gọi hoạt động này khi một nút trên chính của tôi màn hình được nhấp):

Intent intent = new Intent(getActivity(), ClientsMainActivity.class); 
startActivity(intent); 

Dễ vấn đề là, ClientsMainActivity không gọi một OnCreateView hoặc bất cứ điều gì, chỉ cần đặt bố cục để bố trí định nghĩa Fragment của tôi, và ListFragment tôi. Điều này là tốt vì tôi không cố gắng để vượt qua bất cứ điều gì vào ClientsMainActivity, nhưng nếu tôi có một hoạt động giả định như:

SessionMainsActivity được gọi khi họ nhấp vào chỉnh sửa phiên của khách hàng, thì tôi sẽ không gọi SessionsMainActivity cùng một cách (bắt đầu hoạt động mà chỉ cần đặt để alayout), tôi sẽ muốn rằng bố trí thiết lập như nó xác định cách phân đoạn của tôi được chia ra. Nhưng tôi cũng muốn chuyển dữ liệu đến đó và sau đó đến các đoạn tiếp theo (như phiên mà họ đã nhấp vào để chỉnh sửa/mucking với.

Vì vậy, tôi tự hỏi liệu điều trên có ý nghĩa không, tôi chắc chắn nó đơn giản Tôi không có vấn đề gì khi gọi điện thoại của tôi, tôi không có vấn đề gì khi gọi FragmentActivitie s từ các mảnh khác, chúng chiếm toàn bộ màn hình nhưng nó hoạt động.Vì vậy, tôi đoán vấn đề lớn là ClientsMainActivity là từ một số ví dụ tôi tìm thấy trực tuyến Điều làm tôi thấy tất cả những gì mà FragmentActivity thực hiện là đặt chế độ xem nội dung thành bố cục thực hiện tất cả công việc, vì vậy đó là lý do tại sao tôi không thể tìm ra cách tôi sẽ mã hóa nó làm điều tương tự nhưng hãy để tôi chuyển các giá trị cho các mảnh mà bố cục xác định, v.v.

END EDIT

Vì vậy, tôi đang sử dụng thoải mái chút hướng dẫn này ở đây:

http://developer.android.com/guide/topics/fundamentals/fragments.html

Nó đã gạt tôi một chặng đường dài và sử dụng những gì họ nói để làm cho các hoạt động chính, và fragment_layout.xml, tôi có một danh sách khách hàng tốt đẹp ở bên trái (Thats a listfragment) và một đoạn chi tiết bên phải.

Sau đó, tôi đã thêm khả năng chỉnh sửa thông tin phiên trên máy khách (hoặc chỉnh sửa chi tiết khách hàng) cả hai đều là các đoạn toàn màn hình. Điều này làm việc tuyệt vời.

Bây giờ tôi đã quyết định Chỉnh sửa phiên của mình ui tốt nhất sẽ được phân phát chia nhỏ thông tin thành hai ô một lần nữa.

này không được làm việc như tôi nghĩ, như tôi đã nói tôi có một main_Activity mà thực hiện điều này trong onCreate:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_client_activity); 
} 

với main_client_activity.xml được quy định tại hai bố trí nhưng một cho máy tính bảng phong cảnh ở đây:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment class="com.viciousbytes.studiotab.subactivities.ClientListView" 
     android:id="@+id/client_list" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" /> 

    <FrameLayout android:id="@+id/client_details" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" 
     android:background="?android:attr/detailsElementBackground"/> 

</LinearLayout> 

Tất cả đều hoạt động tuyệt vời! Trong trường hợp mà tôi xử lý mọi thứ khác như một hoạt động toàn màn hình mà bắt đầu đoạn riêng của mình:

EditSessionActivity EditClientActiivyt cả hai đều sử dụng getSupportFragmentManager() beginTransaction và tôi có thể chuyển thông tin vào nó từ cuộc gọi .newInstance..

Tôi đã bố trí session_edit.xml được xác định bằng các nút, bản xem trước văn bản, v.v. và đã hoạt động tốt. Đó là những gì tôi tải trong đoạn SessionEdit của tôi "đưa ra" bởi EditSessionActivity của tôi Nhưng bây giờ kể từ khi tôi muốn chia nó ra tôi chạy vào một snag. Ở trên tôi đã định nghĩa một client_list và một id client_details, các trình giữ chỗ này trên màn hình của tôi? Tôi có tham khảo những điều đó khi tôi muốn thay thế những gì ở đó với những mảnh hoàn toàn khác nhau không?

hoặc để tôi xây dựng một bố cục đoạn gọi là cái gì đó như fragment_session_layout trong đó xác định một cái gì đó như:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment class="com.viciousbytes.studiotab.subactivities.SessionEdit" 
     android:id="@+id/session_edit" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" /> 

    <FrameLayout android:id="@+id/invoice_details" android:layout_weight="1" 
     android:layout_width="0px" android:layout_height="match_parent" 
     android:background="?android:attr/detailsElementBackground" /> 
</LinearLayout> 

Xin lỗi không biết những gì để danh hiệu này trên đầu lưỡi của tôi về những gì tôi đang hỏi, về cơ bản như thế nào để có hai mảnh vỡ hai lần. THe demo trực tuyến cho thấy làm thế nào để làm một (và một ListFragment đơn giản ở đó).

Tôi đã làm tất cả ở trên và tôi chỉ không thể tìm ra cách để vượt qua vào đoạn dữ liệu tôi cần, tôi đã sử dụng này trong EditSessionActivity tôi:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    int clientID = getIntent().getIntExtra(THE_SELECTED_CLIENT, -1);    
    int sessionID = getIntent().getIntExtra(SELECTED_SESSION,-1); 
    SessionEdit edits = SessionEdit.newInstance(this.getBaseContext(), false, clientID, sessionID); 
    mUIListener = (OnUpdateUI)edits; 
    getSupportFragmentManager().beginTransaction().add(android.R.id.content, edits).commit(); 
} 

mà làm việc, nhưng để cố gắng tuân thủ với ví dụ về đoạn trước đó, tôi giả định rằng EditSessionActivit y của tôi đã được sắp xếp giống như tạo một MainActivity khác (vì nó có hai ô trong đó giống như bảng chính). vì vậy tôi recoded các onCreate trong EditSessionActivity với điều này:

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

nào sau khi chiến đấu ở mảnh EditSession của tôi đối phó với onCreateView, tôi nhận này để cuối cùng làm việc nhưng không thể vượt qua trong các dữ liệu gây ra không có instantiation của đối tượng sử dụng như trước đây onCreateedits=SessionEdit.newInstance(...)

Vì vậy, thực hành tốt là thực hiện bố cục đoạn khác có hai điểm đau trong đó và bắt đầu lên khi hành động đúng được kích hoạt. Hoặc là một trong những nghĩa vụ phải thay thế hai mảnh đã được tạo ra ?? từ số main_client_activity.xml của tôi bằng cách nào đó?

+0

Tôi có cùng một "vấn đề" bây giờ, tôi đã có 2 listfragments trong xem và tôi đang thay đổi dinamically sau khi một hàng được chọn.Tôi nghĩ rằng rất nhiều cái nào là tốt hơn nhưng tôi không nghĩ rằng đây là cách tốt nhất mà tôi đã sử dụng. – kameny

+0

Các ví dụ cho các đoạn trực tuyến này thường đủ cho các trường hợp đơn giản, nhưng nhiều hơn thế và bạn tự làm. Hy vọng rằng ai đó có một gợi ý tốt. – Codejoy

+0

Tôi rất háo hức với bạn, hướng dẫn này tốt cho các tình huống cơ bản và nếu ai đó muốn tạo giao diện người dùng phức tạp với các mảnh mà anh ấy cần suy nghĩ rất nhiều: D – kameny

Trả lời

3

Tôi giả định khách hàng chỉnh sửa và phiên chỉnh sửa là hai hoạt động riêng biệt. Khi bạn chuyển từ chế độ "chỉnh sửa khách hàng" sang chế độ "chỉnh sửa phiên", cả bảng "danh sách" và "chi tiết" sẽ thay đổi?

Tôi sẽ đi với hai tệp bố cục, thay vì cố gắng sử dụng lại cùng một bố cục và tải lại các đoạn trong đó.

Nếu bạn đã cố gắng để tái sử dụng cách bố trí tương tự, bạn sẽ phải:

  • Thay đổi @+id/invoice_details một cái gì đó giống như @+id/right_pane. Nếu không, nó sẽ trông khó hiểu để tải một cái gì đó liên quan đến phiên vào giữ chỗ "invoice_details".
  • thay thế định nghĩa đoạn bằng một FrameLayout khác và tải ClientListView hoặc SessionListView (hoặc tuy nhiên nó được gọi là) đoạn tại đó khi chạy.

Điều này sẽ thêm phức tạp hơn việc có một tệp xml bố cục khác theo ý kiến ​​của tôi.

Vì vậy

  • Hãy mã hiện tại của bạn làm việc với danh sách khách hàng và khách hàng chi tiết
  • Duplicate tất cả các phần có liên quan, và thay đổi những gì cần phải được thay đổi để nó bây giờ danh sách phiên và chi tiết phiên
  • Remove sao chép nơi nó dễ dàng để làm (chức năng phổ biến đi đến các lớp tiện ích, các yếu tố bố trí phổ biến để bố trí bao gồm). Để lại những thứ khó có thể bị trùng lặp.
  • Đánh giá lại sau, khi bạn có nhiều phân đoạn hơn, nhiều bố cục và nhiều kinh nghiệm hơn.

CẬP NHẬT, khoảng hai cách tiếp cận mảnh vỡ khác nhau có thể được nhúng vào trong hoạt động

Theo các tiểu bang tài liệu Android, có hai cách chính mà bạn có thể nhận được một đoạn để hiển thị trong hoạt động của bạn:

  • khai báo phân đoạn trong tệp XML của bố cục (<fragment class=.... />)
  • đặt trình giữ chỗ FrameLayout trong tệp XML của bố cục và đoạn tải lúc chạy

Cách tiếp cận đầu tiên là tốt khi đoạn không cần nhận bất kỳ đối số nào. Chẳng hạn như, nếu logic để truy xuất danh sách khách hàng duy nhất và duy nhất được mã hóa cứng trong mã của đoạn.

Cách tiếp cận thứ hai cho phép bạn chuyển đối số cho đoạn và do đó thích hợp cho loại phân đoạn chi tiết ".

Từ câu hỏi được cập nhật Tôi hiểu rằng,

  • mỗi khách hàng có một danh sách riêng biệt của phiên
  • các thành phần trong vở kịch là: EditSessionActivity nơi đặt máy chủ hai đoạn, một để hiển thị danh sách các phiên khác để hiển thị chi tiết phiên

Nếu đúng, thì bạn thực sự cần tải cả hai phần theo chương trình vì cả hai tham số cần được chuyển đến. Vì vậy, bố cục của bạn sẽ có hai số FrameLayout s. Các EditSessionActivity sẽ bắt đầu với việc nhận được một số thông số từ ý định ("danh sách các phiên làm việc chúng tôi đang làm việc với?"), Và tải "danh sách các phiên" mảnh với các thông số này.Khi người dùng chọn mục danh sách trong đoạn đó, đoạn khác sẽ được tải với các chi tiết phiên.

+0

cảm ơn phản hồi. Tôi sẽ làm được điều này. Tôi nghĩ rằng vấn đề lớn nhất là cách mã bố trí của tôi làm việc là một bên là một ListFragment, phía bên kia chỉ là một FrameLayout. Vì vậy, trong công cụ phiên của tôi, tôi muốn hai FrameLayouts (hoặc tại thời điểm này họ sẽ là mảnh?) Tôi nghĩ rằng tôi cũng đã nhầm lẫn về cách chuyển một số đối tượng phức tạp (đối tượng dữ liệu của riêng tôi) sang FragmentActivity trong trường hợp này làm cho nó serializable? Tôi không xem xét điều này trong một thời gian vì vậy tôi sẽ kiểm tra lại để xem phần nào đang treo tôi đặc biệt và đăng lại ở đây. – Codejoy

+0

Nếu công cụ phiên là tương tự như khách hàng (danh sách các phiên bên trái, chi tiết phiên bên phải) thì tôi nghĩ bố cục của bạn cũng sẽ tương tự: ListFragment ở bên trái, FrameLayout ở bên phải. Khi một mục được chọn trong danh sách bên trái, một đoạn để chỉnh sửa chi tiết phiên sẽ được tải vào FrameLayout. Đối với việc truyền dữ liệu xung quanh: các đối tượng có thể tuần tự (có thể chuyển nhượng) hoặc trạng thái toàn cục. Hoặc, nếu các đối tượng đến từ một cái gì đó giống như cơ sở dữ liệu sqlite cục bộ, bạn có thể vượt qua các ID cơ sở dữ liệu và đọc các đối tượng của bạn từ DB khi cần. –

+0

câu hỏi được cập nhật không sao để phản ánh vấn đề chính của tôi. – Codejoy

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