我正在尝试在我的活动中使用 TabLayout 。每个选项卡将用户带到一个片段。
getFragmentManager().popBackStack()。现在我还想将选定的选项卡更新为 Tab1。有什么方法可以在 TabLayout 中将选项卡标记为选定状态而不调用 TabSelectedListener 吗?
我有一个 Activity 和两个 Fragment,其中tablayout包含viewpager. 现在我可以通过实现谷歌的指南回调接口从片段到活动进行通信。但是我怎样才能以另一种方式从 Activity 到 Fragment进行通信呢?如果活动中发生了一些事情(外部事件),我想更新片段。我设法获得了 Frag1 片段
MyFragmentPagerAdapter a = (MyFragmentPagerAdapter) viewPager.getAdapter();
Frag1 frag = (Frag1) a.getItem(0);
Run Code Online (Sandbox Code Playgroud)
但是当我在 frag 上调用公共方法时,我得到一个 IllegalStateException: Fragment not Attached to Activity 可能是因为 getItem(0) 返回 Frag1 的新实例并且尚未附加...有没有人可以为此提供干净的解决方案整个 Viewpager -> Activity 到 Fragment 通信?
一些代码给你:
在活动中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
if (viewPager != null) {
viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager()));
}
TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
if (tabLayout != null) {
tabLayout.setupWithViewPager(viewPager); …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager android-activity android-tablayout
以下是我的代码TabLayout
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
app:tabIndicatorHeight="0dp"
app:tabSelectedTextColor="@android:color/white"
app:tabTextColor="@color/city_grey"
app:tabTextAppearance="@style/DashboardTabLayoutTextAppearance"
android:paddingTop="@dimen/dp10"
android:paddingBottom="@dimen/dp10"
app:tabPaddingStart="@dimen/dp20"
app:tabPaddingEnd="@dimen/dp20"
app:tabMode="scrollable"
app:tabGravity="fill"/>
Run Code Online (Sandbox Code Playgroud)
而 DashboardTabLayoutTextAppearance 是
<style name="DashboardTabLayoutTextAppearance" parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textSize">@dimen/sp40</item>
<item name="android:fontFamily">sans-serif-light</item>
</style>
Run Code Online (Sandbox Code Playgroud)
可以看出,TabLayout高度已设置为wrap_content,选项卡文本textSize已发送到40sp。
因此,TabLayout高度自然应该根据文本高度增加。但在某些设备上,它会垂直剪切文本。
我尝试使用layout_margin和padding属性,但它没有解决问题。
编辑1:添加代码以显示我正在初始化TabLayout和ViewPager
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
adapter.addFragment(DashboardWeeklyFragment.newInstance(weeklyData), "Weekly");
adapter.addFragment(DashboardMonthlyFragment.newInstance(monthlyData), "Monthly");
adapter.addFragment(DashboardDailyFragment.newInstance(dailyData), "Daily");
viewPager.setAdapter(adapter);
}
Run Code Online (Sandbox Code Playgroud) 我有 3 个选项卡,这些选项卡在 swiperefreshlayout 中有 recyclerview。我无法通过滑动更改这些选项卡。我认为这是因为,我的触摸事件是由 swiperefreshlayout 而不是 tablayout 接收的。如何解决我的问题?
以下是我的布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/news_swipe_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.example.nabinkhadka.hamrodang.activity.NewsActivity"
tools:showIn="@layout/app_bar_main">
<android.support.v7.widget.RecyclerView
android:id="@+id/news_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.v4.widget.SwipeRefreshLayout>
Run Code Online (Sandbox Code Playgroud)
问题:
- 如果我将 ViewPager 移到 RecyclerView 上方,则滑动可以工作,但无法看到 Recyclerview。
- 如果我为这两个创建一个相对布局并将每个放置在另一个之上,我将无法在其中一个上进行触摸事件
我该如何解决?
谢谢你!
android android-viewpager swiperefreshlayout android-tablayout
你好!我希望这个视图可以滚动:
正如您所看到的,TAB1 中的“临时内容”只是用来模拟可能出现的临时内容。
我现在想做的是使整个页面可滚动。我设法做的是使 TAB1 的内容(即 TabLayout 的内容)可滚动,但这不是我想要做的。正如所描述的,整个页面应该是。
这是持有视图的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="at.codecrane.whosnext.MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="200dp">
<ImageView
android:id="@+id/imageView2"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:srcCompat="@android:color/darker_gray" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="100dp"
android:layout_height="100dp"
app:srcCompat="@drawable/ic_face"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="32dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/imageView3"
android:layout_centerHorizontal="true"
android:text="Temp Name"
android:textSize="18sp" />
</RelativeLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorColor="@color/colorPrimary">
<android.support.design.widget.TabItem
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="General" />
<android.support.design.widget.TabItem
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Statistics" />
</android.support.design.widget.TabLayout>
</android.support.v4.view.ViewPager>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
这是 ViewPager-Content 的片段布局:
<!-- TODO: Update blank fragment …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager android-tablayout
我在Lenovo K50a40、OS 6.0 和其他一些设备的crashlytics中发现了以下崩溃日志。我无法从此日志中跟踪异常,也无法找到此异常来自我的应用程序的任何线索。我在社区中没有发现任何人之前遇到过类似的问题。如果您对此有所了解,请分享您的见解。
java.lang.IllegalStateException: View with id -1: android.support.design.widget.TabLayout$TabView#onMeasure() did not set the measured dimension by calling setMeasuredDimension()
at android.view.View.measure(View.java:19199)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1723)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1275)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:650)
at android.support.design.widget.TabLayout$SlidingTabStrip.onMeasure(TabLayout.java:1859)
at android.view.View.measure(View.java:19169)
at android.widget.HorizontalScrollView.measureChildWithMargins(HorizontalScrollView.java:1259)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:223)
at android.widget.HorizontalScrollView.onMeasure(HorizontalScrollView.java:315)
at android.support.design.widget.TabLayout.onMeasure(TabLayout.java:1030)
at android.view.View.measure(View.java:19169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1723)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:788)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:648)
at android.support.design.widget.AppBarLayout.onMeasure(AppBarLayout.java:234)
at android.view.View.measure(View.java:19169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:719)
at android.support.design.widget.AppBarLayout$Behavior.onMeasureChild(AppBarLayout.java:1008)
at android.support.design.widget.AppBarLayout$Behavior.onMeasureChild(AppBarLayout.java:787)
at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:789)
at android.view.View.measure(View.java:19169)
at android.widget.RelativeLayout.measureChild(RelativeLayout.java:786)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:560)
at android.view.View.measure(View.java:19169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:223)
at …Run Code Online (Sandbox Code Playgroud) android illegalstateexception android-view android-tablayout
我是编程新手,我想添加一个设置菜单按钮。
如图所示,我的应用程序不显示三点按钮。
MainActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
ViewPager viewPager = findViewById(R.id.view_pager);
viewPager.setAdapter(sectionsPagerAdapter);
TabLayout tabs = findViewById(R.id.tabs);
tabs.setupWithViewPager(viewPager);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.settings, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.vueSatellite:
Toast.makeText(this, "Hi", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager.widget.ViewPager …Run Code Online (Sandbox Code Playgroud) 我需要根据服务器配置文件在运行时将片段添加到 viewpager2 以及选项卡。我见过的大多数 viewpager2 资源都展示了使用新 TabMediator 选项卡布局的静态 viewpager2。我正在跳过 viewpager,因为我需要添加 viewpager2 支持的 RTL 和垂直滚动。
我最关心的是当我添加和删除片段时如何跟踪特定页面/片段的索引。已完成本教程和代码作为示例。
android android-fragments android-tablayout android-viewpager2
为了使 TabItem 文本变大,我缺少什么?我已经解决了所有类似的问题并尝试了许多不同的陈述。我尝试将样式应用于 TabLayout 以及 TabItem,但似乎没有任何效果,文本大小也没有改变。Material Design 版本中是否缺少此功能?谢谢
活动主文件
<com.google.android.material.tabs.TabLayout
style="@style/TabTheme"
android:layout_width="694dp"
android:layout_height="72dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:tabIndicatorHeight="6dp"
app:tabTextAppearance="@style/TabTheme">
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Clock In" />
Run Code Online (Sandbox Code Playgroud)
样式.xml
<style name="TabTheme">
<item name="android:textSize">40dp</item>
<item name="android:textStyle">normal</item>
<item name="android:textAllCaps">true</item>
<item name="android:textColor">@color/primaryDarkColor</item>
<item name="android:includeFontPadding">false</item>
</style>
Run Code Online (Sandbox Code Playgroud)
我还尝试将以下样式应用于 TabLayout 和 TabItem 但没有结果:
<style name="CustomTabText" parent="TextAppearance.Design.Tab">
<item name="android:textSize">100sp</item>
</style>
Run Code Online (Sandbox Code Playgroud)