目前正在通过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;
答案 0 :(得分:1)
实现目标的一种非常简单直接的方法是为onClick
中的<Button>
元素提供XML
属性,因为您拥有button
在XML
中,我建议您为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);