2011-10-17 46 views
14

我有一个简单的应用程序,有两个片段,当在横向模式下,两个片段并排显示,并在肖像中显示片段A,然后如果他们选择一个选项,启动一个活动显示片段B.我的问题是当我处于肖像模式并显示片段B时,如果用户选择了一个菜单选项我想刷新或重绘与片段B相关联的视图,并且无法理解如何使其工作。我尝试了getView方法和getLayoutInflater方法,但屏幕不会更改,因为我认为我正在创建一个新视图。我也试图获得对片段的引用A我认为我可以调用它的例程来构建一个新的片段并替换片段B,但由于它没有被显示而无法获取对它的引用。我真正需要做的只是强制再次调用onCreateView方法来膨胀新视图,但我尝试了几种方法来尝试这样做,但无法再次调用onCreateView。任何想法如何?安卓力量片段重建查看

回答

1

如果用户选择我要刷新或重绘与片段B关联,并且不知道如何使这项工作

onOptionsItemSelected()查看菜单选项,有活动电话该片段上的一个方法使其用新内​​容更新其小部件。或者,让活动执行FragmentTransaction来替换片段(如果片段最初是通过FragmentTransaction设置的)。

9

您将要执行FragmentTransaction并使用replace()方法

这应该不是太难的事,但答案将取决于您的菜单的位置(即是你onOptionsItemSelected()再打你的内父活动还是在片段A/B?)。

假设为了简单起见,您的菜单实现和onOptionsItemSelected()位于父级活动中,并且您希望在选择menu_option1的情况下重新塑造片段。这将是这个样子:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// Handle item selection 
//... 
switch (item.getItemId()) { 
case R.id.menu_option1: 
    //do something 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
    return true; 
case R.id.menu_option2: 
    //do something else; 
    return true; 
default: 
    return super.onOptionsItemSelected(item); 
} 
} 

另外,如果你的菜单是你的一个片段(它应该是更多的可重用代码的缘故)的孩子,再一个方法是要求主机活动实现由Fragment定义的接口,可以将其用作回调。 而在片段类中的onOptionsItemSelected()回调中,您只需调用此回调方法即可。

尽管听起来像一口满口,但你只需要做几件事。假装这是你的片段类

public static class FragmentA extends ListFragment { 
OnSelectedListener mListener; 
// Container Activity must implement this interface 
public interface OnSelectedListener { 
    public void onSelected(); 
} 
... 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    //This is to ensure that the Activity has implemented the interface we set up above 
    try { 
     mListener = (OnSelectedListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement OnSelectedListener"); 
    } 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// Handle item selection 
//... 
switch (item.getItemId()) { 
case R.id.menu_option1: 
    //do something 
    getActivity().onSelected(); 
    return true; 
case R.id.menu_option2: 
    //do something else; 
    return true; 
default: 
    return super.onOptionsItemSelected(item); 
} 
} 
... 
} 

然后在活动中,你会看到类似这样的:

public class MainActivity extends Activity implements FragmentA.onSelectedListener{ 
... 
public void onSelected(){ 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 
} 
+7

当你更换R.id.your_fragment_id,你是假设它在XML声明。但是如果我的原始片段是以编程方式构建的呢? –

+1

@IgorGanapolsky这将是该片段容器的ID – dmSherazi