Android 活动顶部的片段

Android 活动顶部的片段,android,android-fragments,Android,Android Fragments,我有一个主要的活动和一些元素。其中一个是按钮。我想在单击按钮时加载一个片段。我希望片段涵盖整个活动,而不仅仅是在布局中。然后在片段中还有一个按钮,它必须加载另一个片段,覆盖所有内容,然后加载另一个片段,以此类推 所以我在活动上设置了一个OnClickListener来加载第一个片段。活动负载刚刚好。如果我点击其他活动的按钮,一切都很好。但无论我尝试了什么,当我点击应该加载片段的按钮时,它总是崩溃 以下是主要活动的代码: public class SignUpActivity extends Ap

我有一个主要的活动和一些元素。其中一个是按钮。我想在单击按钮时加载一个片段。我希望片段涵盖整个活动,而不仅仅是在布局中。然后在片段中还有一个按钮,它必须加载另一个片段,覆盖所有内容,然后加载另一个片段,以此类推

所以我在活动上设置了一个OnClickListener来加载第一个片段。活动负载刚刚好。如果我点击其他活动的按钮,一切都很好。但无论我尝试了什么,当我点击应该加载片段的按钮时,它总是崩溃

以下是主要活动的代码:

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几乎都是一样的。活动的RelativeLayout、片段的FrameLayout以及所有片段的ScrollView、ImageView、EditText、TextView和按钮

到目前为止,我根据网络上的建议尝试了以下内容:

  • 主活动的xml使用RelativeLayout。我试图把碎片装进去,但失败了
  • 我把它改成了框架布局
  • 我使用了fragmentTransaction.add(R.id.fragment\u容器,nameFragment)
  • 我没有使用add(),而是尝试替换(R.id.activity\u sign\u up,nameFragment)
  • 扩展到碎片活动
  • 在我的主要活动的xml中将FrameLayout设置为片段容器
我认为我的错误是没有以正确的方式设置要添加片段的位置

我很确定这是新手犯的错误,但我以前从未使用过碎片。有什么建议吗

谢谢

编辑: 这就是我单击按钮时的错误

E/AndroidRuntime:致命异常:主 过程:be.test.test,PID:16763 java.lang.RuntimeException:be.test.test。SignUpActivity@276634a3必须实现OnFragmentInteractionListener 位于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.CalculateFlagments(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) 位于java.lang.reflect.Method.invoke(本机方法) 位于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)


您应该使用activity_sign_up.xml中的FrameLayout和replace 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();
              }
    }
public class SignUpActivity extends AppCompatActivity implements SignNameFragment.OnFragmentInteractionListener {
    //implement the interface methods here
}
以及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;


    }
}

你可以在那里创建任何你想要的片段类。

你的错误说明了一切,你没有
实现
接口

您的
SignUpActivity
需要实现接口
OnFragmentInteractionListener
,然后您必须重写其方法

应该是这样的:

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();
              }
    }
public class SignUpActivity extends AppCompatActivity implements SignNameFragment.OnFragmentInteractionListener {
    //implement the interface methods here
}

为什么不发布错误?如果您不需要OnFragmentInteractionListener,则可以将其完全删除。但是替换不需要id类型吗?replace(int,Fragment)也尝试了您的解决方案,但对我的情况没有帮助。谢谢你的帮助,就这样。我想我检查的所有示例都比较旧,没有使用OnFragmentInteractionListener。奇怪的是,我实际上没有在任何地方使用它,但没有它,应用程序就会崩溃。如果它对你有帮助,你可以将它标记为已接受。如果你不使用该界面,你可以随时删除它,以后可能需要它来传输数据。但我不明白,如果它没有被使用,为什么我必须实现它。