Android 更新标签页内容
Android update tab content
在 a codelabs tutorial 之后,我正在尝试实现一个 activity,我将在其中显示来自房间数据库的内容。它需要访问文本视图(选项卡的内容)才能更新它。但我能做的最好的事情就是更新选项卡的 title,即使我为内容设置了 textview。
简而言之,我有一个要添加选项卡的tablayout,我为新添加的选项卡设置了布局。然后我访问选项卡视图的文本视图,以更新内容。 textview 的 id 是正确的,但它更改了选项卡的标题。我是不是理解错了 customview 的概念?
[更新]
经过一些修改后,问题似乎是创建的片段和我要更新的片段不一样:第一个是用视图创建的,而其他的则不是。因此我无法访问他们的视图来更新他们的内容。
现在有一点代码来说明:
我有一个主activity
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("Tab1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab2"));
final ViewPager viewPager = findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
// Setting a listener for clicks.
viewPager.addOnPageChangeListener(new
TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(
new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
int index = viewPager.getCurrentItem();
PagerAdapter adapter = ((PagerAdapter) viewPager.getAdapter());
TabFragment fragment = adapter.getFragment(index);
fragment.setSettings();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
}
它的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".Main2Activity"
tools:showIn="@layout/activity_main2">
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/toolbar"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@id/tab_layout"/>
</RelativeLayout>
我的标签片段
public class TabFragment extends Fragment {
private static final String ARG_SECTION_NUMBER = "section_number";
private View fragview;
public TabFragment() {
// Required empty public constructor
}
public static TabFragment newInstance(int sectionNumber) {
TabFragment fragment = new TabFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
this.fragview = inflater.inflate(R.layout.fragment_tab, container, false);
TextView textView = (TextView) this.fragview.findViewById(R.id.text_tab);
textView.setText("TAB ");
return this.fragview;
}
public void setSettings(){
TextView textView = (TextView) this.fragview.findViewById(R.id.text_tab);
textView.setText("DONE ");
}
}
它的布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TabFragment">
<TextView
android:id="@+id/text_tab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_blank_fragment" />
还有一个适配器
public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
private Context context;
private Map<Integer, TabFragment> pageReferenceMap = new HashMap<Integer, TabFragment>();
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
TabFragment myFragment = TabFragment.newInstance(position);
pageReferenceMap.put(position, myFragment);
return new TabFragment();
}
@Override
public void destroyItem (ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
pageReferenceMap.remove(position);
}
@Override
public int getCount() {
return mNumOfTabs;
}
public TabFragment getFragment(int index) {
return pageReferenceMap.get(index);
}
}
tab.getCustomView()
将 return 您用于此选项卡的自定义视图。
您混淆了选项卡自己的视图和片段(包含在 viewPager 中)的视图。
您为选项卡和 TabFragment 设置了相同的布局
这里
tabLayout.addTab(tabLayout.newTab().setCustomView(R.layout.fragment_tab)
.setText("Tab1"));
这里
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_tab, container, false);
}
第一件事:您应该将 fragment_tab
重命名为 custom_tab_layout
之类的名称以避免这种混淆。
现在你想更新内容(片段)文本,所以你需要从 viewPager 中获取片段,你可以找到 here
在 a codelabs tutorial 之后,我正在尝试实现一个 activity,我将在其中显示来自房间数据库的内容。它需要访问文本视图(选项卡的内容)才能更新它。但我能做的最好的事情就是更新选项卡的 title,即使我为内容设置了 textview。
简而言之,我有一个要添加选项卡的tablayout,我为新添加的选项卡设置了布局。然后我访问选项卡视图的文本视图,以更新内容。 textview 的 id 是正确的,但它更改了选项卡的标题。我是不是理解错了 customview 的概念?
[更新] 经过一些修改后,问题似乎是创建的片段和我要更新的片段不一样:第一个是用视图创建的,而其他的则不是。因此我无法访问他们的视图来更新他们的内容。
现在有一点代码来说明:
我有一个主activity
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("Tab1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab2"));
final ViewPager viewPager = findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
// Setting a listener for clicks.
viewPager.addOnPageChangeListener(new
TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(
new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
int index = viewPager.getCurrentItem();
PagerAdapter adapter = ((PagerAdapter) viewPager.getAdapter());
TabFragment fragment = adapter.getFragment(index);
fragment.setSettings();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
}
它的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".Main2Activity"
tools:showIn="@layout/activity_main2">
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/toolbar"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@id/tab_layout"/>
</RelativeLayout>
我的标签片段
public class TabFragment extends Fragment {
private static final String ARG_SECTION_NUMBER = "section_number";
private View fragview;
public TabFragment() {
// Required empty public constructor
}
public static TabFragment newInstance(int sectionNumber) {
TabFragment fragment = new TabFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
this.fragview = inflater.inflate(R.layout.fragment_tab, container, false);
TextView textView = (TextView) this.fragview.findViewById(R.id.text_tab);
textView.setText("TAB ");
return this.fragview;
}
public void setSettings(){
TextView textView = (TextView) this.fragview.findViewById(R.id.text_tab);
textView.setText("DONE ");
}
}
它的布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TabFragment">
<TextView
android:id="@+id/text_tab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_blank_fragment" />
还有一个适配器
public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
private Context context;
private Map<Integer, TabFragment> pageReferenceMap = new HashMap<Integer, TabFragment>();
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
TabFragment myFragment = TabFragment.newInstance(position);
pageReferenceMap.put(position, myFragment);
return new TabFragment();
}
@Override
public void destroyItem (ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
pageReferenceMap.remove(position);
}
@Override
public int getCount() {
return mNumOfTabs;
}
public TabFragment getFragment(int index) {
return pageReferenceMap.get(index);
}
}
tab.getCustomView()
将 return 您用于此选项卡的自定义视图。
您混淆了选项卡自己的视图和片段(包含在 viewPager 中)的视图。
您为选项卡和 TabFragment 设置了相同的布局
这里
tabLayout.addTab(tabLayout.newTab().setCustomView(R.layout.fragment_tab)
.setText("Tab1"));
这里
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_tab, container, false);
}
第一件事:您应该将 fragment_tab
重命名为 custom_tab_layout
之类的名称以避免这种混淆。
现在你想更新内容(片段)文本,所以你需要从 viewPager 中获取片段,你可以找到 here