【发布时间】: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 中,并且不允许我输入新的布局。
非常感谢您的帮助。
谢谢。
【问题讨论】:
-
有这个函数getChildFragmentManager() 用于嵌套片段。不过不知道是不是和你的问题有关系。
标签: android-studio android-fragments android-viewpager