Android的1.6安培;片段放; Tabhost [英] Android 1.6 & Fragment & Tabhost
问题描述
我正在升级的Android应用程序(1.6兼容),它使用一个 TabHost
显示3个不同的选项卡嵌套活动。
当时我用了的ActivityGroup
诱骗显示在标签内嵌活动,但我很不满意这种方法,因为它是一个真正的痛苦,以处理某些功能。
我听说片段API兼容性包1.6和片段
看上去很适合我想要做的(显示嵌套视图/选项卡中的功能与过渡效果和的东西),但我不能使它与上班 TabHost
(它本来是一起工作的操作栏
但它不是可以在兼容包)。
有没有任何你们发现了一种在应用程序中创建这样一个结构呢?
我在这里的错误是:
ERROR / AndroidRuntime(955):java.lang.RuntimeException的:产生的原因无法
要启动活动 ComponentInfo {com.XXX}: java.lang.IllegalArgumentException异常:无 查看发现的ID 0x1020011的 片段MyFragment
code
的main.xml
< TabHost的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:ID =@机器人:ID / tabhost
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT>
<的LinearLayout
机器人:方向=垂直
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT>
<的FrameLayout
机器人:ID =@机器人:ID / tabcontent
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
机器人:填充=5DP
机器人:layout_weight =1/>
< TabWidget
机器人:ID =@机器人:ID /标签
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
机器人:layout_weight =0/>
< / LinearLayout中>
< / TabHost>
MainActivity.java
公共类MainActivity扩展TabActivity {
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.main);
资源RES = getResources();
最终TabHost标签= getTabHost();
TabHost.TabSpec规范;
我的意图;
I =新的意图(这一点,MyActivity.class);
规格= tabs.newTabSpec("MyActivity").setIndicator("MyActivity",res.getDrawable(R.drawable.tab)).setContent(i);
tabs.addTab(规范);
}
}
MyActivity.class
公共类MyActivity扩展FragmentActivity {
私有静态字符串变量=MyActivity;
私有静态FragmentManager fragmentManager;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ListeResultatFragment片段= MyFragment.newInstance();
fragmentTransaction.add(android.R.id.tabcontent,片段,MyFragment);
fragmentTransaction.commit();
}
}
MyFragment.java
公共类MyFragment扩展片段{
公共静态MyFragment的newInstance(){
MyFragment实例=新MyFragment();
返回实例;
}
@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
返回inflater.inflate(R.layout.fragment,集装箱,假);
}
}
现在的问题是,你的 MyActivity
试图伸手向封闭 MainActivity
通过使用 android.R.id.tabcontent
作为容器的id。这是不可能的。相反, MyActivity
需要有其自己的布局(例如,一个的FrameLayout),它可以用作父的片段。在此布局,必须存在,可以通过标识引用的图。
假设你有一个叫做布局 activity_layout.xml
,其中包含了ID的FrameLayout'一的FrameLayout。然后,您可以修改的onCreate
方法 MyActivity
来是这样的:
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
查看父= getLayoutInflater()膨胀(R.layout.activity_layout,空)。
的setContentView(父);
fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
片段片段= MyFragment.newInstance();
fragmentTransaction.add(R.id.framelayout,片段,MyFragment);
fragmentTransaction.commit();
}
在换句话说, MyActivity
需要能够工作在其自身。尽量让它先工作,然后在 MainActivity
含有TabHost。
MyActivity
I'm working on upgrading an Android application (1.6 compatibility) which uses a TabHost
to show 3 different tabs with nested activities.
At the time I used the ActivityGroup
trick to show nested activities in a tab but I'm very unhappy with this method since it's a real pain to handle some features.
I heard about the Fragments API compatibility package for 1.6 and a Fragment
looks perfect for what I want to do (show nested views / features within a tab with transition effects and stuff) but I can't make it work with a TabHost
(It was meant to work with an Action Bar
but it's not available in the compatibility package).
Did any of you guys found a way to create such a structure in your applications?
My error here is :
ERROR/AndroidRuntime(955): Caused by: java.lang.RuntimeException: Unable
to start activity ComponentInfo{com.XXX}: java.lang.IllegalArgumentException: No view found for id 0x1020011 for fragment MyFragment
CODE
main.xml
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_weight="1" />
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0" />
</LinearLayout>
</TabHost>
MainActivity.java
public class MainActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res = getResources();
final TabHost tabs = getTabHost();
TabHost.TabSpec spec;
Intent i;
i = new Intent(this, MyActivity.class);
spec = tabs.newTabSpec("MyActivity").setIndicator("MyActivity",res.getDrawable(R.drawable.tab)).setContent(i);
tabs.addTab(spec);
}
}
MyActivity.class
public class MyActivity extends FragmentActivity {
private static String TAG = "MyActivity";
private static FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ListeResultatFragment fragment = MyFragment.newInstance();
fragmentTransaction.add(android.R.id.tabcontent, fragment, "MyFragment");
fragmentTransaction.commit();
}
}
MyFragment.java
public class MyFragment extends Fragment {
public static MyFragment newInstance() {
MyFragment instance = new MyFragment();
return instance;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment, container, false);
}
}
The problem is that your MyActivity
tries to reach out to the enclosing MainActivity
by using android.R.id.tabcontent
as a container id. This is not possible. Instead, MyActivity
needs to have its own layout (e.g. a FrameLayout) which can be used as the parent for the Fragment. In this layout, there must exist a view that can be referenced by id.
Let's say you have a layout called activity_layout.xml
which contains a FrameLayout with the id 'framelayout'. You can then modify the onCreate
method in MyActivity
to something like this:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View parent = getLayoutInflater().inflate(R.layout.activity_layout, null);
setContentView(parent);
fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment fragment = MyFragment.newInstance();
fragmentTransaction.add(R.id.framelayout, fragment, "MyFragment");
fragmentTransaction.commit();
}
In other words, MyActivity
needs to be able to work on its own. Try to make it work first, and then embed MyActivity
in the MainActivity
containing the TabHost.
这篇关于Android的1.6安培;片段放; Tabhost的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!