当我切换到另一个片段时,My Fragment(在Viewpager中)gots空白

时间:2017-09-21 07:02:28

标签: android android-fragments android-fragmentactivity

我在我的Secondactivity中使用带有TabLayout工具栏的Viewpager。 在这些viewpager中使用Id"容器"我展示了四个片段: HomeActivity,PayActivity,VideoSectionsActivity和BillActivity。

在片段VideoSectionsActivity中,我有一个按钮,它应该将VideoSectionsActivity的内容更改为另一个ActionActivity内容。

更新

如果你监督这个我想在viewpager中更改我的片段。

但我的VideoSectionsActivity中的代码:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class VideoSectionsActivity extends Fragment {

    Button action;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View v = inflater.inflate(R.layout.fragment_video_sections, container, false);
        action = (Button) v.findViewById(R.id.genre_action);

        action.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getFragmentManager().beginTransaction().replace(R.id.container, new VideoActivity()).addToBackStack(null).commit();
            }
        });

        return v;
    }
}

效果不好。如果我点击按钮,除了HomeActivity之外,我的所有片段都会变为空白。我使用了错误的代码,还是应该在SectionPagerAdapter中进行一些修改?

如果您需要更多代码,我必须在此处添加,所以请告诉我。

编辑:

如果我使用getChildFragmentManager(),我收到此错误消息:

09-21 08:15:05.308 12931-12931/com.example.fdai3744.t_online20 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                 Process: com.example.fdai3744.t_online20, PID: 12931
                                                                                 java.lang.IllegalArgumentException: No view found for id 0x7f0d008e (com.example.fdai3744.t_online20:id/container) for fragment VideoActivity{69c42ef #0 id=0x7f0d008e}
                                                                                     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1293)
                                                                                     at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
                                                                                     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
                                                                                     at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758)
                                                                                     at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363)
                                                                                     at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149)
                                                                                     at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103)
                                                                                     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2013)
                                                                                     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)
                                                                                     at android.os.Handler.handleCallback(Handler.java:751)
                                                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                     at android.os.Looper.loop(Looper.java:154)
                                                                                     at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

3 个答案:

答案 0 :(得分:2)

如果您的片段位于视图寻呼机

内,请尝试getChildfragmentManager()

尝试以下代码

action.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getChildFragmentManager().beginTransaction().replace(R.id.container, new VideoActivity()).addToBackStack(null).commit();
        }
    });

答案 1 :(得分:1)

使用以下代码替换您的片段;

action.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
  Fragment fragment = new VideoActivity();
  FragmentManager fm = getActivity().getSupportFragmentManager();
  FragmentTransaction ft = fm.beginTransaction();
  ft.replace(R.id.container, fragment);
  ft.commit();
  }
});

答案 2 :(得分:0)

我找到了解决问题的简便方法。 首先:非常感谢Vinayak B,他提到在ViewPagers中无法更改片段。

诀窍是你必须在viewpager中加载一个空片段,它只包含一个带有id的FrameLayout。

然后你在你的空片段的Java类中写:

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.IdOfYourFrameLayout, new FragmentActivity());
    transaction.commit();

您还可以在http://www.pineappslab.com/post/fragments-viewpager/

上看到本教程