タブレット3.2バージョンをターゲットにしています。私は画面の左側にlistactivityを表示しています。ユーザーがlistitemをクリックすると、詳細が画面の右側に表示されます。私はクリックされた各項目の異なる詳細レイアウトを持っているので、画面の右側にフラグメントを表示しています。私は詳細セクションのタブレイアウトに表示する必要があります。私はフラグメントを拡張し、oncreateviewでxmlにtabhostをルート要素として追加しました。何とか断片が膨らんでいない。各タブのために私は表示するリストビューを持っています。下はコードセクションです...私が得るエラーはNullPointerExceptionです。フラグメントにタブを表示できない
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
public class Projects extends Fragment implements OnTabChangeListener {
private int mCurrentTab;
private TabHost mTabHost;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View tablayout = inflater.inflate(R.layout.projects, null);
mTabHost = (TabHost)tablayout.findViewById(android.R.id.tabhost);
final View v1 = tablayout.findViewById(R.id.webprojects);
final View v2 = tablayout.findViewById(R.id.androidprojects);
final View v3 = tablayout.findViewById(R.id.iphoneprojects);
mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("WEB").setContent(new TabHost.TabContentFactory() {
public View createTabContent(String tag) {
// TODO Auto-generated method stub
return v1;
}
}));
mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("ANDROID").setContent(new TabHost.TabContentFactory() {
@Override
public View createTabContent(String tag) {
// TODO Auto-generated method stub
return v2;
}
}));
mTabHost.addTab(mTabHost.newTabSpec("tab3").setIndicator("IPHONE").setContent(new TabHost.TabContentFactory() {
@Override
public View createTabContent(String tag) {
// TODO Auto-generated method stub
return v3;
}
}));
return tablayout;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
setRetainInstance(true);
mTabHost.setOnTabChangedListener(this);
mTabHost.setCurrentTab(mCurrentTab);
}
@Override
public void onTabChanged(String tabId) {
// TODO Auto-generated method stub
FragmentTransaction FrgTra = getFragmentManager().beginTransaction();
if(tabId.equals("WEB"))
{
if(getFragmentManager().findFragmentByTag(tabId) == null)
{
FrgTra.replace(R.id.webprojects, new ProjectsListFragment("WEB"), tabId).commit();
}
}
if(tabId.equals("ANDROID"))
{
if(getFragmentManager().findFragmentByTag(tabId) == null)
{
FrgTra.replace(R.id.androidprojects, new ProjectsListFragment("ANDROID"), tabId).commit();
}
}
if(tabId.equals("IPHONE"))
{
if(getFragmentManager().findFragmentByTag(tabId) == null)
{
FrgTra.replace(R.id.iphoneprojects, new ProjectsListFragment("IPHONE"), tabId).commit();
}
}
}
}
と私が使用しているXMLは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<TabHost 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:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TabWidget android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0" />
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0">
<FrameLayout android:id="@+id/webprojects"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</FrameLayout>
<FrameLayout
android:id="@+id/androidprojects"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</FrameLayout>
<FrameLayout
android:id="@+id/iphoneprojects"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</FrameLayout>
</FrameLayout>
</LinearLayout>
</TabHost>
私はこの問題を解決する助けてください....
に従うことをあなたに成功したパスを与えるん私のlistfragmentをlistactivityに変更してもそれはうまく動作しませんでしたが、申し訳ありませんsolarsheriff。私はあなたにすべての変更を提案しました。私はまだ同じエラーがあります。アンドロイドのドキュメントでは、私はtabactivityを使用する必要があると言います。しかし、現在は推奨されていません。 okは私のコードを忘れる。私はそれを変更する準備ができています。私が必要とするのは、画面の左側にあるリストの項目をクリックするときです。画面の右側にタブ付きのレイアウトが必要です。)タブとバージョン3.2をターゲットにしています。もしあなたが私にそれを達成するためにしなければならないことを私に提案してください。 – vivek
私はそのvivekを助ける方法がわかりません。プログラムによるタブの設定は私のために働いていません(バージョン2.2)。私の提案は、各タブレイアウトの単純なhello worldの例です。リストから項目を選択すると、フラグメントを1つのアクティビティ/レイアウトで表示することができます。そのため、タブホストインターフェースを直接使用せずにシミュレートすることができます。 – TheSolarSheriff
独自のCursorAdapterでビューホルダーデザインパターンを使用する方法もあります。ビュー所有者は、単にfindViewById()を呼び出す必要性を否定するデータ構造です。さらに、リストを構築するときに、.setTag()を使用して、リスト項目レイアウトに含まれるビューにオブジェクトを割り当てることができます。 onListItemClickイベントを処理すると、Listとレイアウトの間のリンクが作成されます。あなたのリストフォームのレイアウトを確認し、使用します。 getTag()。これにより、クリックされた項目に応じた適切な振る舞いが容易になります。 – TheSolarSheriff