我正在创建一个包含每个片段的五个选项卡.我在第一个选项卡和ListView中使用ListView OnItemClickListener
我想从第一个Tab片段替换为第二个选项卡Fragment.我怎么能用Fragment
和TabHost
?我扩展Fragment
了主类和所有片段类.我不是延伸FragmentActivity
.那么如何将标签从一个片段更改为另一个片段呢?
MainClass:
public class TabsFragment extends Fragment implements OnTabChangeListener {
private View mRoot;
public TabHost mTabHost;
private int mCurrentTab;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mRoot = inflater.inflate(R.layout.tabs_fragment, null);
mTabHost = (TabHost) mRoot.findViewById(android.R.id.tabhost);
setupTabs();
return mRoot;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
mTabHost.setOnTabChangedListener(this);
mTabHost.setCurrentTab(mCurrentTab);
// manually start loading stuff in the first tab
updateTab("1");
} …
Run Code Online (Sandbox Code Playgroud) 如何在FragmentTabHost中显示片段的状态?
感谢本教程,我能够FragmentTabHost
在我的应用程序中实现.
我的目的是创建一个应用程序,其主要活动包含一些选项卡(在整个应用程序的顶部).单击每个选项卡将在选项卡下方打开一个新片段.
问题是当我单击选项卡时执行某些操作,然后转到另一个选项卡,该选项卡将打开一个新的片段,然后返回到第一个选项卡 - 此处的更改不会保留.
流:
我真的需要实现这个逻辑.如果我的方法有误,请建议替代方案.
谢谢
码:
主要活动
public class FagTabHostMain extends FragmentActivity {
FragmentTabHost mTabHost;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fag_tab_host_main);
mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
mTabHost.addTab(mTabHost.newTabSpec("audio").setIndicator("Audio"),
AudioContainerFragmentClass.class, null);
mTabHost.addTab(mTabHost.newTabSpec("video").setIndicator("Video"),
VideoContainerFragmentClass.class, null);
}
@Override
public void onBackPressed() {
boolean isPopFragment = false;
String currentTabTag = mTabHost.getCurrentTabTag();
if (currentTabTag.equals("audio")) {
isPopFragment = ((AudioContainerFragmentClass) getSupportFragmentManager()
.findFragmentByTag("audio")).popFragment();
} else if (currentTabTag.equals("video")) {
isPopFragment = ((VideoContainerFragmentClass) getSupportFragmentManager()
.findFragmentByTag("video")).popFragment();
}
// Finish when …
Run Code Online (Sandbox Code Playgroud) 在我的Android应用中,我使用以下代码创建标签:
mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
MyFragment.class, null);
Run Code Online (Sandbox Code Playgroud)
在该addTab
方法中,第三个参数是Bundle对象并且是null
.我可以使用第三个参数将参数传递给我的片段吗?
android API文档为空addTab
,并不记录此参数.
我已经使用片段标签主机一段时间了,它工作正常.突然间我得到了这个布局编译错误.
Exception raised during rendering: No tab known for tag null
Run Code Online (Sandbox Code Playgroud)
activity_tabhost_search.xml:
<android.support.v4.app.FragmentTabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:orientation="horizontal" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</android.support.v4.app.FragmentTabHost>
Run Code Online (Sandbox Code Playgroud)
请不要将它关闭,因为我检查了所有线程,但我无法解决这个问题.
有一些与此问题相关的问题.例如,这一个.但它不起作用.
让我展示一下我在代码中所做的事情.
activity_main.xml中
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context=".MainActivity" tools:ignore="MergeRootFrame" >
<fragment
android:id="@+id/my_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.zhouhao.test.MyFragment"
tools:layout="@layout/fragment_my" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
fragment_my.xml(我的主要片段包含FragmentTabHost)
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="100"
android:orientation="horizontal">
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0" />
<LinearLayout
android:layout_width="0dp"
android:layout_weight="95"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/panel_content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>
</android.support.v4.app.FragmentTabHost>
Run Code Online (Sandbox Code Playgroud)
fragment_tab1.xml(对于与不同选项卡对应的片段,它们类似,所以我只显示一个代码)
<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="com.example.zhouhao.test.TabFragment">
<!-- TODO: Update blank fragment layout -->
<TextView android:layout_width="match_parent" android:layout_height="match_parent"
android:text="@string/fragment_tab1" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
MainActivity.java
protected …
Run Code Online (Sandbox Code Playgroud) 我无法获得指向Fragment的指针,Fragment是FragmentTabhost中当前可见的片段.
我有一个SherlockFragmentActivity
调用SecondActivity
,从它的onCreate
方法加载Tabhost 像这样:
if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
Fragment f = new TabsFragment();
getSupportFragmentManager().beginTransaction().add(android.R.id.content, f, "tabsfragment").commit();
}
Run Code Online (Sandbox Code Playgroud)
TabsFragment
是SherlockFragment
使用此onCreate
方法创建选项卡的子类
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mTabHost = new FragmentTabHost(getActivity());
mTabHost.setup(getActivity(), getChildFragmentManager(), R.layout.tabs);
mTabHost.addTab(mTabHost.newTabSpec("Tab1").setIndicator("Offers",
getResources().getDrawable(R.drawable.offersale)),
OfferListFragment.class,
null);
mTabHost.addTab(mTabHost.newTabSpec("Tab2").setIndicator("News",
getResources().getDrawable(R.drawable.newspaper)),
NewsFragment.class,
null);
return mTabHost;
}
Run Code Online (Sandbox Code Playgroud)
现在当我在第二个选项卡中时,我在一个由原始活动启动的类中完成了后台任务SecondActivity
,然后我调用它应该给我一个对该选项卡的引用,但它总是返回null!
NewsFragment newsView = (NewsFragment) delegate.getSupportFragmentManager().findFragmentByTag("Tab2");
该delegate
变量是一个指针回SecondActivity
当它启动后台类.
如何获得指向选项卡片段的指针?我错了,添加标签时设置的"Tab2"是Tag
片段吗?
我知道SO
有关问题的帖子有各种各样的问题,但没有一个问题能为我提供解决方案.我有4个标签fragment activity
,每个标签都有自己的标签fragment
.我要进入另一个fragment
里面.当我切换到标签时,它有时会重叠并且两者都可见.
这是代码(xml):
<Button
android:id="@+id/checkBal"
android:layout_width="fill_parent"
android:layout_height="45dp"
android:clickable="false"
android:gravity="left|center_vertical"
android:typeface="serif" />
<View
android:layout_width="fill_parent"
android:layout_height="2dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="2dp"
android:background="@color/green" />
<FrameLayout
android:id="@+id/realtabcontent"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
<android.support.v4.app.FragmentTabHost
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0" />
</android.support.v4.app.FragmentTabHost>
Run Code Online (Sandbox Code Playgroud)
public class Tab_Activity extends FragmentActivity {
FragmentTabHost mHost;
Button balance;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.tabs);
balance = (Button) findViewById(R.id.checkBal);
mHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
mHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
mHost.addTab(mHost.newTabSpec("Home").setIndicator("Home"), …
Run Code Online (Sandbox Code Playgroud) 在Android应用程序(min sdk 11,target sdk 18)上,扩展Fragment的类应该创建带有一个标签和一个图标的TabHost选项卡(TabSpec).但...
TabSpec ts1;
// if the label is set to "Home", the label is displayed but not the image
ts1 = tab_host.newTabSpec("TAB_ONE").setIndicator("Home", getActivity().getResources().getDrawable(R.drawable.ic_tabone)).setContent(R.id.edit_species_tab);
// if the label is null or empty, the image is displayed
ts1 = tab_host.newTabSpec("TAB_ONE").setIndicator(null, getActivity().getResources().getDrawable(R.drawable.ic_tabone)).setContent(R.id.edit_species_tab);
Run Code Online (Sandbox Code Playgroud)
据我所知,文档没有提到标签和图标是互斥的.
起初我以为标签有一个固定的背景颜色隐藏图标,但事实并非如此.事实上,当我设置TabHost背景时,我可以看到标签是透明的:
tab_host.getTabWidget().setBackgroundResource(R.drawable.ic_mybackground);
Run Code Online (Sandbox Code Playgroud)
如何设置TabSpec背景,以便为每个选项卡显示标签和图标?
tab_host.xml
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingTop="65dp" >
<LinearLayout
android:id="@+id/edit_species_tab"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="5dp" >
</LinearLayout>
<LinearLayout
android:id="@+id/edit_regions_tab"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="5dp" >
</LinearLayout> …
Run Code Online (Sandbox Code Playgroud) android android-layout android-tabhost android-drawable fragment-tab-host
我想创建使用刷卡标签界面FragmentTabHost
用ViewPager
.到目前为止,我得到了碎片滑动.唯一发生的事情是碎片能够在标签后面滑动,这些标签被禁用/卡住而不能正常工作.如何使FragmentTabHost选项卡与ViewPager配合使用以在选项卡之间滑动?
我尝试使用没有viewpager的FragmentTabHost,它工作正常,但它只是不使用viewpager.
这是它的样子截图:
主要Java源代码:
import java.util.List;
import java.util.Vector;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTabHost;
import android.support.v4.view.ViewPager;
public class MainActivity extends FragmentActivity {
private FragmentTabHost mTabHost;
private ViewPager pager;
private MyPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
pager = (ViewPager) findViewById(R.id.viewpager);
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, BatteryFragment.class.getName()));
fragments.add(Fragment.instantiate(this, DeviceFragment.class.getName()));
fragments.add(Fragment.instantiate(this, NetworkFragment.class.getName()));
adapter = new MyPagerAdapter(getSupportFragmentManager(), fragments);
pager.setAdapter(adapter);
mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
mTabHost.addTab(mTabHost.newTabSpec("battery").setIndicator("Battery",
getResources().getDrawable(R.drawable.ic_battery_tab)), …
Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager android-fragmentactivity fragment-tab-host
我搜索了很多关于这个问题并应用了这些解决方案,但没有成功。我需要将透明度应用于 FragmentTabHost 并显示该 TabHost 下的任何内容。
我还对所有五个选项卡 1 x 1 应用了透明颜色,但这并没有影响。提前致谢。
XML 代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/homeToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/red">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/home"
android:textColor="#ffffff"
android:textStyle="normal" />
</RelativeLayout>
</android.support.v7.widget.Toolbar>
<FrameLayout
android:id="@+id/realtabcontent"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
<android.support.v4.app.FragmentTabHost
android:id="@android:id/tabhost"
android:background="@color/transparent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:background="@drawable/tab_background"
android:layout_height="0dp"
android:layout_weight="0" />
</android.support.v4.app.FragmentTabHost>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)