【问题标题】:Fragment on top of an ActivityActivity 顶部的片段
【发布时间】:2016-10-14 23:58:27
【问题描述】:

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

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

这里是主Activity的代码:

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。

目前我根据网上的建议尝试过的事情:

  • 主Activity 的xml 使用RelativeLayout。我尝试在其中加载 Fragment,但失败了
  • 我把它改成了 FrameLayout
  • 我使用了 fragmentTransaction.add(R.id.fragment_container,nameFragment)
  • 我没有使用 add(),而是尝试了 replace(R.id.activity_sign_up,nameFragment)
  • 扩展到 FragmentActivity
  • 在我的主 Activity 的 xml 中将 FrameLayout 设置为 Fragment 容器

我相信我的错误是我没有以正确的方式设置要添加片段的位置。

我很确定这将是一个新手错误,但我以前从未使用过 Fragments。那么有什么建议吗?

谢谢

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

E/AndroidRuntime: 致命异常: main 进程: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.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) 在 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)

【问题讨论】:

标签: android android-fragments


【解决方案1】:

你的错误说明了一切,你不是 implementinginterface

你的SignUpActivity需要实现接口OnFragmentInteractionListener,然后你必须重写它的方法。

应该是这样的:

public class SignUpActivity extends AppCompatActivity implements SignNameFragment.OnFragmentInteractionListener {
    //implement the interface methods here
}

【讨论】:

  • 就是这样。我猜我检查的所有示例都较旧并且没有使用 OnFragmentInteractionListener。奇怪的是我实际上并没有在任何地方使用它,但是没有它应用程序崩溃了。
  • 如果对您有帮助,您可以将其标记为已接受,如果您不使用该界面,您可以随时删除它
  • 我稍后可能需要它来传输数据。但我不明白为什么如果不使用它就必须实现它。
【解决方案2】:

您应该在 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();
              }
    }

和 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;


    }
}

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

【讨论】:

  • 但是替换不需要id类型吗?替换(int,片段)
  • 也尝试了您的解决方案,但对我的情况没有帮助。无论如何感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多