2010-07-01 30 views
6

Tôi gặp một vấn đề khi sử dụng ActivityGroup. Tôi có hai hoạt động bên trong một ActivityGroup và cả hai đều sử dụng một menu (ghi đè onCreateOptionMenu và onOptionsItemSelected).Android ActivityGroup Menu Problem

Vâng, vấn đề là hoạt động thứ hai trong nhóm không hiển thị menu khi tôi nhấn phím menu. Hoạt động đầu tiên hoạt động tốt cho thấy menu.

Bất kỳ ý tưởng nào về vấn đề này?

Tôi có mã này trong hoạt động trẻ:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    boolean result = super.onCreateOptionsMenu(menu); 
    menu.add(0, MENU_REFRESH, 0, R.string.menu_refresh).setIcon(R.drawable.ic_menu_refresh); 
    return result; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case MENU_REFRESH: 
     Log.d(TAG,"REFRESH"); 
     refresh(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
+0

Tôi nghĩ rằng đây là hành vi đáng kinh ngạc của thứ hai Hoạt động. Hãy thử chọn bất kỳ điều khiển nào hiện tại trên hoạt động thứ 2 và sau đó nhấn nút menu. Menu sẽ xuất hiện, nhưng tôi không biết tại sao. –

+0

Tôi gặp vấn đề tương tự Tôi cũng nhận được cùng một menu cho hoạt động thứ hai. thậm chí tôi có một menu riêng biệt xác định cho hoạt động thứ hai. xin vui lòng cho tôi biết làm thế nào để khắc phục vấn đề này – Sam

Trả lời

1

Kiểm tra this chủ đề.

Menu có thể được xử lý trong các phụ huynh aactivity, nhưng tạo ra trong con hoạt động

+0

ok nhưng làm thế nào tôi có thể gọi một phương pháp hoạt động của trẻ nếu tôi xử lý các menu trong hoạt động phụ huynh? – xger86x

+0

@ xger86x: Đó là vấn đề. Bạn nên xử lý menu trong một hoạt động con không phải trong một phụ huynh. – Macarse

+0

@macarse ok vậy .... làm thế nào để tôi làm điều đó? bạn có hiểu câu hỏi của tôi không Nếu tôi phải gọi một phương thức trên hoạt động con tôi không thể từ phụ huynh .. – xger86x

7

Một cách tốt đẹp của việc xử lý này là sử dụng LocalActivityManager của ActivityGroup. Lấy quản lý hoạt động của địa phương, có được hoạt động hiện tại, và thực hiện các phương pháp thích hợp của hoạt động:

public boolean onPrepareOptionsMenu(Menu menu) { 
    //super.onPrepareOptionsMenu(menu); 
    return getLocalActivityManager().getCurrentActivity() 
     .onCreateOptionsMenu(menu); 
} 

public boolean onCreateOptionsMenu(Menu menu) { 
    //super.onCreateOptionsMenu(menu); 
    return getLocalActivityManager().getCurrentActivity() 
     .onCreateOptionsMenu(menu); 
} 

public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    //super.onMenuItemSelected(featureId, item); 
    return getLocalActivityManager().getCurrentActivity() 
     .onMenuItemSelected(featureId, item); 
} 

Lưu ý: sử dụng chiến lược này, bạn không phải gọi super.onCreateOptionsMenu từ đứa trẻ hoạt động- làm như vậy gây ra một ngoại lệ stack overflow . Tôi không chắc mục đích của việc gọi các superclass trên các phương thức *, như tôi đã bỏ qua chúng và không thấy kết quả tiêu cực. (...))

1

Tuy nhiên, cách tiếp cận khác là tạo trình đơn trong gốc Nhóm hoạt động và sau đó sử dụng công cụ boolean onPrepareOptionsMenu (Menu trình đơn) để xóa và thêm lại các mục menu.

Trong lớp ActivityGroup:

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    //what is the current activity? 
    menu.add(0, 0, 0, "holder"); 
    return true; 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) 
{ 
    //start a new 
    menu.clear(); 
    //add some menu options 
    .getLocalActivityManager().getCurrentActivity().onPrepareOptionsMenu(menu); 
    return super.onPrepareOptionsMenu(menu); 
} 

Trong Hoạt động:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) 
{ //add menus or inflate here 
    return true; 
} 
2

Bạn cần phải ghi đè các phương pháp trình đơn trong nhóm hoạt động, và gọi các phương pháp tương ứng về hoạt động của trẻ. Xem bài viết này: How to Create Options Menu on Child Activity inside an ActivityGroup

public class TestGroup extends ActivityGroup { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //start child activity 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     return getLocalActivityManager().getCurrentActivity().onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onMenuItemSelected(int featureId, MenuItem item) { 
     return getLocalActivityManager().getCurrentActivity().onMenuItemSelected(featureId, item); 
    } 
} 
2

sử dụng mã này trên tabGroupActivity

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    // TODO Auto-generated method stub 


    return getLocalActivityManager().getCurrentActivity().onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    // TODO Auto-generated method stub 
    return getLocalActivityManager().getCurrentActivity().onMenuItemSelected(featureId, item); 
} 

sử dụng mã mà đưa ra dưới đây trong cả 2 đứa trẻ hoạt động

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.menu_1, menu); 
    return true; 
}// menu_1 is the xml file in menu folder 
@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 

    switch (item.getItemId()) { 
    case R.id.weekly: 
     Intent weekly = new Intent(getParent(),Activity1.class); 
     TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 
     parentActivity.startChildActivity("weeklyview", weekly); 

     break; 

    case R.id.daily : 
     Intent daily = new Intent(getParent(),Activity2.class); 
     TabGroupActivity parentActivity2 = (TabGroupActivity)getParent(); 
     parentActivity2.startChildActivity("daily", daily); 
     break; 

    default: 
     break; 
    } 

    //use return true 
return true; 
}