【问题标题】:Replace fragments in FrameLayout layout替换 FrameLayout 布局中的片段
【发布时间】:2016-05-21 22:30:53
【问题描述】:

我已经尝试了第一个 google 页面上关于 android 片段的所有教程,但我无法得到任何工作。

所以我有一个导航栏活动,MainActivity。 现在我想通过点击抽屉来更改片段。

在我的content_mainMainActivity 活动中的默认片段)中,我有一个希望放入片段的框架布局。我有以下片段:fragment_mainfragment_onefragment_two。当我单击导航抽屉中的按钮时,我希望显示这些。

我想使用片段的原因是导航抽屉将保持在顶部。

提前致谢!

编辑:这是我将用来更改片段的函数:
只是测试,没有完成。

public void setFragment() {
    android.support.v4.app.FragmentTransaction transaction;
    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, new LoginFragment());
    transaction.commit();
}

【问题讨论】:

  • 在您尝试替换片段的地方分享您的代码。
  • 请发布您的代码,您已经尝试过什么。
  • 这个教程很有帮助! simplifiedcoding.net/…

标签: android android-fragments android-studio


【解决方案1】:

你试过了吗? Click here

此链接将帮助您创建fragment。 这就是你想要的导航抽屉Click here

【讨论】:

  • 导航抽屉是内置的,所以我不需要帮助。我也无法让 FragmentTransaction 工作。但其他人也在帮助我。
【解决方案2】:

我解决了!

显然,我不得不使用android.support.v4.app.Fragment; 而不是android.app.Fragment;。 这是我使用的代码:

protected void setFragment(Fragment fragment) {
    android.support.v4.app.FragmentTransaction t = getSupportFragmentManager().beginTransaction();
    t.replace(R.id.fragment_container, fragment);
    t.commit();
}

然后设置它(从导航栏onNavigationItemSelected(),你这样做:

setFragment(new RoosterFragment());

我希望这可以帮助其他人解决同样令人沮丧的问题。

【讨论】:

    【解决方案3】:

    根据您的问题,

    这是FrameLayout

    <FrameLayout
            android:id="@+id/main_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/view"
            android:layout_marginTop="@dimen/medium_margin"></FrameLayout>
    

    现在,调用你的activity的displayview方法onCreate(),

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
        //rest of your code here
        displayView(0); // fragment at 0 position
    }
    

    displayView 方法,包含三个片段

    public void displayView(int position) {
            switch (position) {
                case 0:
                    tvTitle.setText(getResources().getString(R.string.signin_tile));
                    showFragment(new LoginFragment(), position);
                    break;
                case 1:
                    tvTitle.setText(getResources().getString(R.string.forgot_password_tile));
                    showFragment(new ForgotPasswordFragment(), position);
                    break;
                case 2:
                    tvTitle.setText(getResources().getString(R.string.change_password_tile));
                    showFragment(new ChangePasswordFragment(), position);
                    break;
    
            }
        }
    

    showFragment 方法从 displayView 方法调用,

    public void showFragment(Fragment fragment, int position) {
            FragmentTransaction mTransactiont = getSupportFragmentManager().beginTransaction();
    
            mTransactiont.replace(R.id.main_container, fragment, fragment.getClass().getName());
            mTransactiont.commit();
        }
    

    【讨论】:

    • 将 LoginFragment 的名称更改为 yourFragment 名称 AS LoginFragment 为 FragmentOne
    • 我通过将import android.app.Fragment 更改为import android.support.v4.app.Fragment 消除了错误。很抱歉打扰您。
    • 但是当我再次编译你的代码时,我得到java.lang.RuntimeException: Unable to start activity ComponentInfo{nl.broekhin.magizon/nl.broekhin.magizon.MainActivity}: java.lang.RuntimeException: nl.broekhin.magizon.MainActivity@7f0d233 must implement OnFragmentInteractionListener
    • 请将您的活动扩展到您使用此代码的 FragmentActivity。
    • 您使用的是扩展至活动还是 AppCompatActivity ?
    【解决方案4】:

    试试这个。这是我的新手代码更容易理解:)

    FragmentTransaction transaction;
    
    switch (id){
                case R.id.button_fragment_one:
                        transaction = getSupportFragmentManager().beginTransaction();
                        transaction.replace(R.id.frame_layout, new FragmentOne());
                        transaction.addToBackStack(null);
                        transaction.commit();
                    break;
                case R.id.button_fragment_two:
                        transaction = getSupportFragmentManager().beginTransaction();
                        transaction.replace(R.id.frame_layout, new FragmentTwo());
                        transaction.commit();
                    break;
                default:
                    break;
    }
    

    【讨论】:

    • java.lang.RuntimeException: Unable to start activity ComponentInfo{nl.broekhin.magizon/nl.broekhin.magizon.MainActivity}: java.lang.RuntimeException: nl.broekhin.magizon.MainActivity@1092e59 must implement OnFragmentInteractionListener 每次尝试使用片段时都会收到此错误。
    • 你能给你看片段活动代码吗?你怎么称呼它?
    • @Rachid 我已经添加了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多