2012-03-09 20 views
1

タブレット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> 

私はこの問題を解決する助けてください....

答えて

0

わからない、あなたのコンテンツは、( 新しいTabHost.TabContentFactoryで正しく初期化されます) 呼び出し。

私はTabを入力すると、カーソルidなどの情報を抽出するために必要なアクティビティが必要であることがわかりました。その後、タブに表示されるテキストとアイコンまたはアイコンセレクタを設定して、タブの選択がユーザーの操作に合わせて調整されるようにする必要があります。

Resources _res = app.getResources(); 
// Create an Intent to launch an Activity for the tab (to be reused) 
Intent _intent = new Intent().setClass(this, WEB_TabActivity.class); 
    _intent.putExtra("whenNeeded", whenNeeded); 

// Initialize a TabSpec for each tab and add it to the TabHost 
tabHost.addTab(tabHost.newTabSpec("WEB") 
    .setIndicator(_res.getString(R.string.WEB_Displayed_Tab_Text), 
     _res.getDrawable(R.drawable.WEB_icon_selector)) 
    .setContent(_intent)); 

例のセレクタは次のとおりです。

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- When selected, use color--> 
    <item android:drawable="@drawable/WEB_ICON_color" 
      android:state_selected="true" /> 
    <!-- When not selected, use grey --> 
    <item android:drawable="@drawable/WEB_ICON_Grey" /> 
</selector> 

ご希望のデータを表示する任意のActivityクラスとして、その後コードWEB_TabActivity。

+0

に従うことをあなたに成功したパスを与えるん私のlistfragmentをlistactivityに変更してもそれはうまく動作しませんでしたが、申し訳ありませんsolarsheriff。私はあなたにすべての変更を提案しました。私はまだ同じエラーがあります。アンドロイドのドキュメントでは、私はtabactivityを使用する必要があると言います。しかし、現在は推奨されていません。 okは私のコードを忘れる。私はそれを変更する準備ができています。私が必要とするのは、画面の左側にあるリストの項目をクリックするときです。画面の右側にタブ付きのレイアウトが必要です。)タブとバージョン3.2をターゲットにしています。もしあなたが私にそれを達成するためにしなければならないことを私に提案してください。 – vivek

+0

私はそのvivekを助ける方法がわかりません。プログラムによるタブの設定は私のために働いていません(バージョン2.2)。私の提案は、各タブレイアウトの単純なhello worldの例です。リストから項目を選択すると、フラグメントを1つのアクティビティ/レイアウトで表示することができます。そのため、タブホストインターフェースを直接使用せずにシミュレートすることができます。 – TheSolarSheriff

+0

独自のCursorAdapterでビューホルダーデザインパターンを使用する方法もあります。ビュー所有者は、単にfindViewById()を呼び出す必要性を否定するデータ構造です。さらに、リストを構築するときに、.setTag()を使用して、リスト項目レイアウトに含まれるビューにオブジェクトを割り当てることができます。 onListItemClickイベントを処理すると、Listとレイアウトの間のリンクが作成されます。あなたのリストフォームのレイアウトを確認し、使用します。 getTag()。これにより、クリックされた項目に応じた適切な振る舞いが容易になります。 – TheSolarSheriff

0

** CURSORアダプタとVIEWホルダーパターン

/** 
* Adapter that allows us to match product items to layout fragment<p/> 
* 
* @author The Solar Sheriff 
*/ 
public class MyItemListAdapter extends CursorAdapter { 


public final static String TAG = "MyItemListAdapter"; 

/** 
* Constructor from a list of items 
*/ 
    private LayoutInflater _li; 
    private Context   _context; 
    private Cursor   _in; 
    private int   _productName, 
        _count; 

    public OrderItemListAdapter(Context _Context, Cursor _In) { 
     super(_Context, _In, true); 

     _context   = _Context; 
     _li     = LayoutInflater.from(_context); 
     _in     = _In; 

     _productName  = _in.getColumnIndex("product_name");   
     _count    = _in.getCount(); 


} 


@Override 
public Object getItem(int position) { 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public boolean hasStableIds() { 
    return true; 
} 

@Override 
public int getCount() { 
    return _in.getCount(); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    View _view = _li.inflate(R.layout.list_item_layout, null); 
    return _view; 
} 

private ViewHolder mapItemViewHolder(View _v){ 
    ViewHolder _itemHolder = new ViewHolder(); 

    //Map the views to the ViewHolder 
    _itemHolder.productName = (TextView) _v.findViewById(R.id.itemProductName); 

return _itemHolder; 
} 

@Override 
public void bindView(View _cView, final Context _context, final Cursor _c) { 
    ViewHolder _itemHolder; 

    // When convertView is not null, we can reuse it directly, there is no need 
    // to reinflate it. We only inflate a new View when the convertView supplied 
    // by ListView is null. 
    if (_cView == null) { 
     _cView = _li.inflate(R.layout.list_item_layout, null);   
     _itemHolder = mapItemViewHolder(_cView); 
    _cView.setTag(_itemHolder); 
    } 
    else { 
     // Get the ViewHolder back to get fast access 
     // Can also get a view with no tag so check for null 
     if ((_itemHolder = (ViewHolder) _cView.getTag()) == null) { 
       _itemHolder = mapItemViewHolder(_cView); 
       _cView.setTag(_itemHolder); 
     }   
    } 



//*** TEXT VIEWS *** 

    // Bind the data using the holder. 
    _itemHolder.productName.setText(_c.getString(_productName)); 

    for(String _display : TabLayouts) { 
    if (_display.equals("WEB")) _itemHolder.productName.setTag(Integer.toString(R.layout.WEB_layout)); 
    if (_display.equals("IPHONE")) _itemHolder.productName.setTag(Integer.toString(R.layout.IPHONE_layout)); 
    if (_display.equals("ANDROID")) _itemHolder.productName.setTag(Integer.toString(R.layout.ANDROID_layout)); 

    } 

}  

static String TabLayouts = { "WEB","IPHONE","ANDROID"}; 

static class ViewHolder 
{ 
    TextView  productName; 
} 
} 

// YOUR onSelectedItemリスナーが

MyList.setOnItemSelectedListener(new OnItemSelectedListener() {    

     @Override 
     public void onItemSelected(AdapterView<?> _item, View _View, int _selection, long _id) { 


     ViewGroup _parent = (ViewGroup)_item.getParent();   
     TextView _productName = (TextView)_parent.findViewById(R.id.itemProductName);  

     int _showLayout = Integer.valueOf(_productName.getTag()); 

     //*** e.g. Inflate your fragment layout *** 


     }  

    }); 

希望これは:)

+0

あなたは私の要求が間違っています。私は画面の右側にタブレイアウトが必要です。リストビューのアイテムをクリックすると、画面の左側に表示されます。私はすでに他のリストアイテムをクリックしたときに実装されていると言っています – vivek

+0

OK、ユーザーイベントなしでタブを変更するのがベスト... :) – TheSolarSheriff

+0

私の実装では愚かなミスを犯しました。 )関数を呼び出します。今は大丈夫です。私はそれを働かせた。どうもありがとう – vivek