我试图了解在导航选项卡中使用片段时如何保留片段视图状态.在我的努力中,我遇到了两个问题,我找不到任何适当的解决方案.
我有两个标签,Tab1和Tab2.Tab1的布局由定义FragmentA
,Tab2的布局由定义FragmentB
.我按照这里给出的方法(编辑:文档已经改变,因为这个问题被问到).
第一个问题:即使我的视图有ID,当重新连接片段(在制表符切换旋转之后)时,它们的状态也不会完全恢复.特别是:一个EditText
带有ID 不确实保存其输入的文字,但它并不能挽救它的启用状态.此外,如果启用或禁用按钮,即使它们具有ID,也不会保存.我发现了这个问题的两种可能的解决方法:
hide()/show()
而不是attach()/detach()
切换标签时.onPause()
,将当前片段视图状态保存View
在片段via 的实例变量中getView()
.在onCreateView(Bundle savedInstanceState)
检查该字段不为空,如果是这样的情况下,返回此字段的值.这个解决方案看起来很糟糕,我被告知它可能也会在我的应用程序中引入内存泄漏.第二个问题:考虑以下用户交互:用户在Tab1上启动并进行一些更改,使Tab1的视图状态处于与其默认状态不同的状态(我们希望片段通过制表符和设备倾斜来保存此视图状态) .然后用户转到Tab2.然后用户倾斜她/他的设备(仍然在Tab2).然后用户切换到Tab1(在新的屏幕方向).现在,问题是:当用户最初从Tab1切换到Tab2时,片段被分离,从而丢弃其视图(即使片段实例仍然存在).当用户然后倾斜设备时,活动 - 从而与之相关FragmentA
并且FragmentB
与之相关联 - 被破坏.由于FragmentA
此时不再有视图(记住:它已被分离),我们无法在调用期间保存其视图元素的状态(例如,启用/禁用了哪些按钮)FragmentA.onSaveInstanceState(Bundle savedInstanceState)
.在这种情况下如何恢复片段视图状态?唯一可行的解决方案是将每个视图元素的不同状态标志保存为SharedPreferences吗?对于这样的"日常工作"来说,这似乎太复杂了.
我想为我的android-application(平板电脑的上部布局,智能手机的较低布局)实现以下布局,包括在子项目之间滑动的功能:
所以我用Eclipse创建了一个Master/Detail-Flow活动,它运行正常.对于标签我已经看了一下Support-Library Samples(<sdk>/extras/android/support/v4/samples/
),其中给出了一个漂亮的例子(FragmentTabsPager.java),它扩展了FragmentActivity
类并使用ViewPager
了TabHost
-Widget.
我的想法是将两个示例组合到一个应用程序中,因此我不想将TabPage用作Activity,而是将其用作Fragment.在智能手机上这很好用,但在平板电脑上它只能工作一次(这意味着第一次启动时,内容正确加载,但是当我点击左侧列表中的另一个项目时,不再加载内容).更确切地说:选项卡已加载并具有正确的标签,但应该显示在选项卡的内容区域中的内容不在那里,尽管您可以在选项卡之间滑动,就像内容在那里一样.
我的问题是:
为了更容易看到,我从头开始创建了一个完全符合这个想法的演示应用程序,可以从https://github.com/apacha/MasterDetail_And_Tabs下载.
Stackoverflow上没有解决问题的相关帖子:ViewPager PagerAdapter没有更新View,
编辑1:我已经了解了http://developer.android.com/reference/android/support/v4/app/FragmentTabHost.html并发现了Android FragmentTabHost - 尚未完全出炉?.有了这些提示,我设法让它几乎运行,但现在我可以选择一个不提供滑动支持的工作版本(如果我将Tabs直接添加到tabHost:
FragmentTabHost mTabHost = new FragmentTabHost();
// Add directly to tab-host
mTabHost.addTab(mTabHost.newTabSpec("simple1").setIndicator("Simple1"), CountingFragment.class, b);
Run Code Online (Sandbox Code Playgroud)
如果我添加它并使用FragmentPagerAdapter,则可以使用错误的滑动实现
FragmentTabHost mTabHost = new FragmentTabHost();
ViewPager mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
TabsAdapter mTabsAdapter = new TabsAdapter(getActivity(), mTabHost, mViewPager);
// Add to tab-host-adapter
mTabsAdapter.addTab(mTabHost.newTabSpec("simple1").setIndicator("Simple1"), CountingFragment.class, b);
Run Code Online (Sandbox Code Playgroud)
我已经将所有更改提交到上面提到的存储库.
说明:
假设我有多个类别来自我的REST.我不知道它有多少类别是5,7或有时2等.我想用viewpager将所有类别放在我的选项卡上.我想根据类别大小创建一个选项卡.让我们看看例如假设在我的REST响应中只有2个类别它只创建两个选项卡.如果它有5个类别,那么5个标签,依此类推.
以下是创建选项卡的示例测试示例.
MainActivity.java
public class MainActivity extends AppCompatActivity {
TabLayout tabLayout;
ViewPager viewPager;
Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar=(Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
tabLayout=(TabLayout)findViewById(R.id.tabs);
viewPager=(ViewPager)findViewById(R.id.viewpager);
setupViewPager(viewPager);
viewPager.setCurrentItem(0);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
for(int i=0;i<3;i++){
adapter.addFragment(new OneFragment(), "ONE");
// adapter.addFragment(new TwoFragment(), "TWO");
viewPager.setAdapter(adapter);
}
}
}
Run Code Online (Sandbox Code Playgroud)
ViewPagerAdapter.java
public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager){
super(manager); …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用下面的Tabs实现ActionBar Sherlock,如上面的线框所示.
我应该使用TabActivity吗? - 因为我看到它被弃用了.这是实现同样目标的最佳方式.
android android-fragments android-viewpager actionbarsherlock android-tabs
在此链接中:如何以编程方式应用样式?
凯文格兰特对这个问题进行了解释我的问题与他的代码是上下文部分.确切地说:
ctv = new CustomView(context, R.attr.tabStyleAttr);
Run Code Online (Sandbox Code Playgroud)
在这段代码中它说:上下文无法解析为变量
我想将特定样式应用于选项卡,这就是设置主题对我不起作用的原因.我当然也欢迎任何替代我的问题.
我尝试更改操作栏选项卡的背景颜色,指示器颜色和文本颜色.
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction)
{
CustomView ctv;
ctv = new CustomView(this, R.attr.tabStyleAttr);
tab.setCustomView(ctv);
mViewPager.setCurrentItem(tab.getPosition());
}
Run Code Online (Sandbox Code Playgroud)
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.Ab" parent="@android:style/Theme.Holo.Light">
<item name="android:actionBarStyle">@style/abStyle</item>
<item name="@attr/actionBarTabStyle">@style/tabStyle</item>
<item name="android:actionBarTabTextStyle">@style/tabTextColor</item>
</style>
<style name="abStyle" parent="@android:style/Widget.Holo.Light.ActionBar.Solid">
<item name="android:background">@drawable/ab_solid_style</item>
<item name="android:backgroundStacked">@drawable/ab_stacked_solid_style</item>
<item name="android:backgroundSplit">@drawable/ab_bottom_solid_style</item>
<item name="android:height">100dp</item>
</style>
<style name="tabStyle" parent="@android:style/Widget.Holo.Light.ActionBar.TabView">
<item name="android:background">@drawable/tab_indicator_ab_style</item>
</style>
<style name="tabTextColor" parent="@android:style/Widget.Holo.Light.ActionBar.TabText">
<item name="android:textColor">@android:color/white</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)
MainActivity.java(onCreate)
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create the …
Run Code Online (Sandbox Code Playgroud) android android-viewpager android-tabs android-actionbar-compat
我已经阅读了这个链接中的信息:使用Tab与新的ToolBar(AppCompat v7-21)并对此进行了大量研究.
但问题是SlidingTabLayout项目正在使用Gradle构建文件和结构.我想使用eclipse添加标签布局.我该怎么做呢?
我确实在Android Studio中运行了SlidingTabLayout项目.但是如何在v7:21中将Tabs添加到工具栏?
注意:所有这些都需要在现有项目中完成,该项目包含所有设置,并在API 21中警告我已弃用的API,如ActionBar.setNavigationMode等.
eclipse-adt android-tabs android-5.0-lollipop android-toolbar
嗨大家我得到一个无法在我的OnCreateView
方法中解析构造函数ArrayAdapter,我listAdapter
试图在我的选项卡中列出文本数据,这是我的主要活动.任何帮助将不胜感激我仍然是一个noobie in Java
.
public class MainActivity extends ActionBarActivity {
private Toolbar toolbar;
private ViewPager mPager;
private SlidingTabLayout mTabs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
mPager= (ViewPager) findViewById(R.id.viewPager);
mTabs=(SlidingTabLayout) findViewById(R.id.tabs);
mPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
mTabs.setDistributeEvenly(true);
mTabs.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
mTabs.setSelectedIndicatorColors(getResources().getColor(R.color.colorAccent));
mTabs.setViewPager(mPager);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用android材料设计实现滑动标签布局.但它给了我NullPointerException
.到目前为止,这是我的代码:
MainActivity.java
public class MainActivity extends ActionBarActivity {
private Toolbar toolbar;
private ViewPager pager;
private SlidingTabLayout nLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_appbar);
toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer_fragment);
drawerFragment.setUp(R.id.navigation_drawer_fragment, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar);
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
nLayout = (SlidingTabLayout) findViewById(R.id.tabs);
nLayout.setViewPager(pager);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
} …
Run Code Online (Sandbox Code Playgroud) android nullpointerexception android-fragments android-viewpager android-tabs
我想减少单个选项卡的填充。下图显示了我想要的:
我得到什么:
我目前正在使用版本 0.16.0 的“accompanist-pager”和“accompanist-pager-indicators”。
代码:
@Composable
fun Tabs(tabNames: List<String>, pagerState: PagerState, scrollToPage: (Int) -> Unit) {
TabRow(
selectedTabIndex = pagerState.currentPage,
backgroundColor = Color.White,
contentColor = Color.Black,
divider = {
TabRowDefaults.Divider(
thickness = 4.dp
)
},
indicator = { tabPositions ->
TabRowDefaults.Indicator(
modifier = Modifier.customTabIndicatorOffset(tabPositions[pagerState.currentPage]),
height = 4.dp,
color = EmeraldTheme.colors.primary
)
}
) {
tabNames.forEachIndexed { index, name ->
Tab(
text = {
Text(
text = name,
maxLines = 1,
style = globalSearchDefaultTextStyle,
fontWeight = if (pagerState.currentPage == index) …
Run Code Online (Sandbox Code Playgroud) 我很努力地删除 的下划线TabRow
,但没有成功。这是代码:
@ExperimentalPagerApi
@Composable
fun Tabs(pagerState: PagerState) {
val tabs = listOf(R.string.add, R.string.add)
val scope = rememberCoroutineScope()
val currentPage = pagerState.currentPage
TabRow(
modifier = Modifier
.padding(start = 36.dp, top = 16.dp, end = 36.dp)
.clip(shape = RoundedCornerShape(16.dp)),
selectedTabIndex = currentPage,
backgroundColor = Color.Transparent,
tabs = {
tabs.forEachIndexed { index, tab ->
Tab(
modifier = Modifier.clip(RoundedCornerShape(16.dp)),
text = {
Text(text = stringResource(id = tab))
},
selected = currentPage == index,
onClick = {
scope.launch {
pagerState.animateScrollToPage(index)
}
}
) …
Run Code Online (Sandbox Code Playgroud)