我有一个带有一些元素的主Activity。其中一个是Button。我想在单击按钮时加载片段。我希望片段覆盖整个Activity,而不仅仅是在它的布局中。然后在Fragment中还有一个Button,它必须加载覆盖所有内容的另一个Fragment,然后是另一个,依此类推。
所以我在Activity上设置一个OnClickListener来加载第一个片段。活动加载就好了。如果我点击其他活动的按钮一切都很好。但无论我尝试什么,当我单击应该加载片段的Button时,它总是会崩溃。
这是主要活动代码:
public class SignUpActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_up);
Button next = (Button) findViewById(R.id.button_next_name);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
SignNameFragment nameFragment = new SignNameFragment();
fragmentTransaction.add(PROBABLY_WHAT_I_AM_DOING_WRONG,nameFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
}
}
所有的xml几乎都是一样的。 Activity的RelativeLayout,Fragments的FrameLayout以及所有这些的ScrollView,ImageView,EditText,TextView和Button。
根据网络上的建议,我到目前为止所尝试的事情:
我认为我的错误在于我没有设置我想以正确方式添加片段的位置。
我很确定它会成为一个新手的错误,但我之前从未使用过碎片。那么有什么建议吗?
谢谢
修改 单击按钮
时出现错误E / AndroidRuntime:致命异常:主要 处理:be.test.test,PID:16763 java.lang.RuntimeException:be.test.test.SignUpActivity@276634a3必须实现OnFragmentInteractionListener at layout.SignNameFragment.onAttach(SignNameFragment.java:84) 在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1043) 在android.support.v4.app.BackStackRecord.setLastIn(BackStackRecord.java:838) 在android.support.v4.app.BackStackRecord.calculateFragments(BackStackRecord.java:861) 在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:719) 在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677) 在android.support.v4.app.FragmentManagerImpl $ 1.run(FragmentManager.java:536) 在android.os.Handler.handleCallback(Handler.java:739) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:145) 在android.app.ActivityThread.main(ActivityThread.java:6145) at java.lang.reflect.Method.invoke(Native Method) 在java.lang.reflect.Method.invoke(Method.java:372) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1399) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
答案 0 :(得分:1)
你应该在activity_sign_up.xml中使用FrameLayout并使用替换FragmentManager方法将片段替换为另一个片段
fragmentManager.beginTransaction().replace(R.layout.activity_sign_up, nameFragment).commit();
我将使用您的代码:
public class SignUpActivity extends AppCompatActivity {
private FragmentManager fragmentManager;
private Fragment switchFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_up);
fragmentManager = getSupportFragmentManager();
switchFragment nameFragment = new SignNameFragment();
fragmentManager.beginTransaction()
.add(R.layout.activity_sign_up, switchFragment)
.commit();
}
public void cambiarFragment(){
switchFragment = new anyTypeFragment();
fragmentManager.beginTransaction()
.replace(R.layout.activity_sign_up, switchFragment)
.commit();
}
}
和nameFragment类:
public class nameFragment extends Fragment {
private Button next;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Inicializar Modelo
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.nameFragment_fragment_layout,container,false); ///Cargar XML, Vista Padre, Si quiero dejarlo siempre
next=(Button)v.findViewById(R.id.btn_crear_grupo);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((SignUpActivity) getActivity()).cambiarFragment();
}
}
});
return v;
}
}
你可以创建任何你想要的Fragment类。
答案 1 :(得分:1)
您的错误说明了这一点,您不是implementing
interface
。
您的SignUpActivity
需要实现接口OnFragmentInteractionListener
,然后您必须覆盖其方法。
应该是这样的:
public class SignUpActivity extends AppCompatActivity implements SignNameFragment.OnFragmentInteractionListener {
//implement the interface methods here
}