单击按钮时无法获取一个片段来替换另一个片段

时间:2015-11-24 19:14:08

标签: android android-fragments

目前正在通过Android Developer页面工作。在运行时,我有一个片段,使用一个按钮说明点击。我想要做的是让按钮简单地将片段更改为我构建的不同片段。现在,点击时没有任何反应。

def mid_generator():

    while True:
        random.shuffle(s1)
        random.shuffle(s2)
        random.shuffle(s3)
        random.shuffle(s4)

        if (    s1[0] != s2[0] and s1[0] != s3[0] and s1[0] != s4[0]
            and s2[0] != s3[0] and s2[0] != s4[0] and s3[0] != s4[0]
            and s1[1] != s2[1] and s1[1] != s3[1] and s1[1] != s4[1]
            and s2[1] != s3[1] and s2[1] != s4[1] and s3[1] != s4[1]                
            and s1[2] != s2[2] and s1[2] != s3[2] and s1[2] != s4[2]
            and s2[2] != s3[2] and s2[2] != s4[2] and s3[2] != s4[2]                
            and s1[3] != s2[3] and s1[3] != s3[3] and s1[3] != s4[3]
            and s2[3] != s3[3] and s2[3] != s4[3] and s3[3] != s4[3]):
            break
    return s1, s2, s3, s4

该按钮被写入Menu_Fragment的XML并具有相应的ID。我的感觉是与最后的public class Menu_Fragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.activity_menu__fragment, container, false); final Button button = (Button) view.findViewById(R.id.button_to_click); button.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Click_Fragment nextFrag = new Click_Fragment(); FragmentTransaction trans = getFragmentManager().beginTransaction(); trans.replace(R.id.fragment_container, nextFrag); trans.addToBackStack(null); trans.commit(); } }); return view; } } 有关,但我不确定这一点,也不知道如何改变它。任何和所有的帮助表示赞赏。如果你能并且愿意指出我正确的方向,这甚至比硬代码解决方案更好。

编辑:

如果问题出在MainActivity上,请输入以下代码:

return view;

3 个答案:

答案 0 :(得分:1)

实现目标的一种非常简单直接的方法是为onClick中的<Button>元素提供XML属性,因为您拥有buttonXML中,我建议您为onClick属性提供onClick="replaceFragment",并在包含该片段的activity中,只提供方法public void replaceFragment(View view){...}。单击按钮时将调用此方法,并且该方法必须位于包含fragment的活动中。最佳做法是在替换片段时使用tag,以避免重新创建类似的片段,而只是替换它们。这是我经常遇到的一个问题。但这只是你的选择。然后你可以使用类似的东西:

if(fragment != null) {
            savedFragment = getFragmentManager().findFragmentByTag(TAG);
            FragmentTransaction ft = getFragmentManager().beginTransaction();

            if(savedFragment != null) {
                ft.replace(R.id.content_frame_id, savedFragment, TAG);
            }
            else {
                ft.replace(R.id.content_frame_id, fragment, TAG);
            }

            ft.addToBackStack(null);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.commit();
        }

fragment是原始片段对象,例如Fragment fragment = new AnyNewFragmentClass()

这样做是搜索您是否已经创建了您要创建的fragment,从而使用它而不是仅创建一个全新的片段对象。如果尚未创建片段,即savedFragment == null,则创建全新的片段。这在维护orientation changes时特别有用。希望这可以帮助。如果您无法理解任何部分,请询问。 :)

答案 1 :(得分:0)

对于嵌套片段,您应该使用getChildFragmentManager()

编辑:

另一方面,如果您需要更改主要活动中的片段,您需要使用

获取主要活动片段管理器
getActivity().getSupportFragmentManager().beginTransaction...

或在主Activity中创建一个公共方法,更改片段并使用

从子片段中调用它
getActivity().ChangeFragment();

并在主要活动中

public void ChangeFragment(){
            FragmentTransaction trans = getFragmentManager().beginTransaction();

            trans.replace(R.id.fragment_container, nextFrag);
            trans.addToBackStack(null);

            trans.commit();
}

答案 2 :(得分:0)

使用以下方法来避免您的问题:

String TAG="fragmentFirst";

  // to replace
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.fragment_container, mFragment, TAG)
            .commit();

    //find by tag as needs    
    Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG);