【问题标题】:Opening a new fragment from within a ViewPager in Android Studio在 Android Studio 的 ViewPager 中打开一个新片段
【发布时间】:2020-04-06 17:36:59
【问题描述】:

我有一个关于从 ViewPager 中打开新片段的问题。

我将 FragmentA、FragmentB 和 FragmentC 设置为 viewpager 的片段,然后继续将 Fragment1 和 Fragment2 设置为位于 FragmentB 中的另一个 viewpager 的片段。

所以 Fragment1 和 Fragment2 位于一个视图分页器中,该视图分页器本质上嵌套在另一个视图分页器中。我正在玩 UI 样式等,这与 Flickr 应用程序中的相似。

我遇到的问题是,一旦我进入片段 1 或片段 2(嵌套片段),我希望能够单击某些内容并绕过我在片段 B 中设置的工具栏进入全屏片段。

下面是我为 FragmentB 提供的带有工具栏、tablayout 和 viewpager 的代码。

package com.app.fragmentdemo;

import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.viewpager.widget.ViewPager;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.material.tabs.TabLayout;

public class FragmentB extends Fragment {


    public FragmentB() {
        // Required empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_b,container,false);

        Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
        TabLayout tabLayout = (TabLayout) rootView.findViewById(R.id.tabs);
        ViewPager viewPager = (ViewPager) rootView.findViewById(R.id.viewPagerFragmentB);

        ViewPagerAdapter adapter = new ViewPagerAdapter(((FragmentActivity) getContext()).getSupportFragmentManager());

        adapter.addFragment(new Fragment1(),"Fragment 1");
        adapter.addFragment(new Fragment2(),"Fragment 2");

        viewPager.setAdapter(adapter);

        tabLayout.setupWithViewPager(viewPager);

        // Inflate the layout for this fragment
        return rootView;
    }
}

这是我为 fragment2 编写的代码,其中包含一个我想带我到另一个片段的按钮。

package com.app.fragmentdemo;

import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

public class Fragment2 extends Fragment {

    public Fragment2() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_2,container,false);

        Button button = (Button) rootView.findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Fragment fragment = new FragmentFull();
                FragmentManager fm = ((FragmentActivity) getContext()).getSupportFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.add(R.id.fragmentFullContainer,fragment);
                ft.commit();

                Toast.makeText(getActivity(), "Button Clicked", Toast.LENGTH_SHORT).show();
            }
        });

        // Inflate the layout for this fragment
        return rootView;
    }
}

点击按钮后,应用程序崩溃。我得到了错误:

没有为片段 FragmentFull 找到 id 0x7f080084 (com.app.fragmentdemo:id/fragmentFullContainer) 的视图

如果我将片段容器的 id 更改为我分配给 Fragment2 布局文件的 id,它可以正常工作。但是,这仍然包含在嵌套的 viewpager 中,并且不允许我输入新的布局。

非常感谢您的帮助。

谢谢。

【问题讨论】:

标签: android-studio android-fragments android-viewpager


【解决方案1】:

在下面一行

ft.add(R.id.fragmentFullContainer,fragment);

fragmentFullContainer 应该是您的R.layout.fragment_2 中的一个视图

您遇到崩溃是因为操作系统在 R.layout.fragment_2 中找不到 fragmentFullContainer

更新

getSupportFragmentManager 替换为getChildFragmentManager

如果你想要全屏,你必须手动隐藏活动视图元素。

很可能,你有来自活动的工具栏,你可以像这样删除它。

((AppCompatActivity)getActivity()).getSupportActionBar().hide();

【讨论】:

  • 我可以更改它,以便它调用 R.layout.fragment_2 中的视图,你是对的,它确实显示并且我没有收到错误。但是,该片段将替换 viewpager 中的现有片段。我希望它创建一个不属于 viewpager 并且可以全屏显示的新片段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多