2014-09-25 16 views
8

Tôi gặp sự cố khi thêm giao dịch phân đoạn vào ngăn xếp phía sau. Tôi có một hoạt động chính trong đó tôi cư bố trí của tôi với một Menu Fragment:Nhấn lùi không quay về đoạn trước

public class MainActivity extends ActionBarActivity{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getFragmentManager().beginTransaction().add(R.id.frag_container, new MainMenuFragment()).commit(); 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

}

Sau đó, bên trong MainMenuFragment, người dùng chọn một số tùy chọn mà kết quả trong việc thay thế đoạn menu với một số đoạn khác :

public class MainMenuFragment extends Fragment implements OnItemClickListener{ 
    GridView grid; 
    FragmentManager manager; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View root = inflater.inflate(R.layout.main_menu_fragment, container, false); 

    manager = getActivity().getFragmentManager(); 
    grid = (GridView) root.findViewById(R.id.gridView1); 

    grid.setAdapter(new MenuTileAdapter(getActivity())); 
    grid.setOnItemClickListener(this); 

    return root; 
} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    FragmentTransaction trans = manager.beginTransaction(); 
    if (position == 0){ 
     trans.replace(R.id.frag_container, new BasicSettingsFragment()); 
     trans.addToBackStack(null); 
     trans.commit(); 
    } 
} 

}

Đối với những gì tôi hiểu, điều này sẽ làm cho nó để khi người dùng nhấn lại nút trên thiết bị của họ, họ sẽ có b rought trở lại mảnh menu, nhưng thay vì điều này thoát khỏi ứng dụng. Tôi đang làm gì sai?

+0

thử thêm thay vì thay thế trans.add (R.id.frag_container, BasicSettingsFragment mới()); –

+0

Ngoài ra, tôi chỉ nhận thấy khi xoay màn hình, rằng các mảnh trình đơn đã không nhận được loại bỏ ở tất cả, chỉ cần ẩn. Khi tôi xoay điện thoại, nó xuất hiện trên 'BasicSettingsFragment'. @GeorgianBenetatos chỉ thêm phần mới vào đầu trang trước đó. – jammaster

+0

Bạn nên đăng đầy đủ mã MainMenuFragment, mọi thứ đều ổn. –

Trả lời

2

Mã của bạn là một bản mixup, bạn sử dụng ActionBarActivity từ appcompat và không sử dụng getSupportFragmentManager() và các đoạn nhập sẽ là appcompat nếu bạn quyết định sử dụng nó. Nếu không, hãy sử dụng Hoạt động thay vì ActionBarActivity và nhập Fragment đơn giản với FragmentManager

Thêm hoạt động này vào hoạt động android:configChanges="keyboardHidden|orientation|screenSize" Điều này sẽ ngừng hoạt động của bạn khi khởi động lại khi bạn xoay. sử dụng setRetainInstance(true) trên các đoạn.

+0

Đọc nhận xét, tôi đã giải quyết phần đó. –

+0

Bạn có lẽ nên khuyến khích OP đăng câu hỏi mới. –

0

Khi bạn thêm hoặc thay thế một đoạn bằng FragmentManager, bạn cần phải thêm phân đoạn cũ vào hậu trường theo cách thủ công với addToBackStack() trước khi gọi commit().

+0

Đó là những gì tôi đang làm. Vấn đề là khi tôi sử dụng 'replace', nó không loại bỏ đoạn cũ, bởi vì khi tôi xoay màn hình, nó xuất hiện trên đầu trang của những gì đã có trước khi quay. – jammaster

1

Bạn không thêm MainMenuFragment vào ngăn xếp. Bạn có thể thử cái này trên hoạt động của bạn:

getFragmentManager().beginTransaction().add(
R.id.frag_container, new MainMenuFragment()). 
addToBackStack(null).commit(); 
5

Trong Hoạt động bạn ghi đè:

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0) { 
     getFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

Và có lẽ bạn cần phải sử dụng trong tất cả các giao dịch đoạn đã cam kết:

FragmentTransaction.addToBackStack(null); 
Các vấn đề liên quan