菅野さん
安藤です。検証いただきありがとうございます!
ご質問のTabContentFactoryですが、以下のように使っています。
(コード全ては載せられないので。。部分抜粋しています。)
public class HogeActivity extends TabActivity implements
TabContentFactory {
private TabHost tabHost;
private Handler handler;
private LayoutInflater inflater;
private Map<String, Item> tagItems;
// その他、各種レイアウト、Viewをメンバに持ちます。
// サービスとのやり取りですが、AIDLを使っているので少し分かりづらいです。(処理内容をはしょってますし。。)
// 要するに、webからのレスポンスが返ってきたらcallbackで「handleResponse()」が呼ばれる、という流れで
す。
// ついでにサービスとの接続が確立したら(onServiceConnected())、webへリクエストしてます。(内部は記載しませ
んが。。)
private HogeService hogeService;
private ServiceConnection con = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder
service) {
hogeService= WebappComService.Stub.asInterface(service);
try {
hogeService.registerCallback(callback);
} catch (RemoteException e) {
Log.e(TAG, e.toString(), e);
}
requestData2Web();
}
@Override
public void onServiceDisconnected(ComponentName name) {
try {
hogeService.unregisterCallback(callback);
} catch (RemoteException e) {
Log.e(TAG, e.toString(), e);
}
hogeService= null;
}
};
private ResponseListener callback = new ResponseListener.Stub() {
@Override
public void onResponse(Response response) throws
RemoteException {
handleResponse(response);
}
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hoge);
handler = new Handler();
inflater = (LayoutInflater)
getSystemService(LAYOUT_INFLATER_SERVICE);
tagItems = new HashMap<String, Item>();
tabHost = getTabHost();
// ここでダミータブを生成しましたが、うまくいきませんでした。
// メンバに持っている各種ViewをfindViewById(int)で生成
// これは100%更新されます。
String hogeText = getIntent().getStringExtra("key");
hogeTextView.setText(hogeText);
}
protected void onStart() {
super.onStart();
bindService(...);
}
protected void onStop() {
unbindService(...);
}
private void requestData2Web() {
// サービスにリクエスト処理を委譲してます。
}
// このメソッドを呼び出すスレッドはサービスからのcallbackになるためUIとは別スレッドです。
private void handleResponse(Response response) {
handler.post(new Runnable() {
tabHost.clearAllTabs();
// tabHost.setVisibility(View.VISIBLE);
// 画像のダウンロード(非同期)
imageDownloader.download(response.getUri(), imageView);
// ここでメンバに持っているViewの更新処理をしています。
// textView.setText(response.getText());といった処理です。
// タブを作成して、作成に必要なデータをメンバ変数に保持します。
for (Item i : response.getItems()) {
String tag = i.getTag();
tagItems.put(tag, i);
TabSpec spec =
tabHost.newTabSpec(tag).setIndicator(tag).setContent(HogeActivity.this);
tabHost.addTab(spec);
}
tabHost.setCurrentTab(0);
});
}
@Override
public View createTabContent(String tag) {
Item item = gagItems.get(tag);
LinearLayout layout = (LinearLayout)
inflater.inflate(R.layout.fuga, null);
// layoutから必要なViewをfindViewById(int)で生成します。
TextView fugaTextView = (TextView)
layout.findViewById(R.id.fugaText);
fugaTextView.setText(item.getFugaText());
return layout;
}
}
ちょっとおおざっぱですが、だいたい意図は伝わるのではないかな、と思っています。
このActivityが呼び出され(Intentで別のActivityから起動されます)、webからのレスポンスがある度に
createTabContent(String)は
呼ばれるようになったのですが(
handler.postでclearAlltabsをしたことで)、肝心のデータ(View)が描画されないので
す。。
タブ自体も見えない状態(INVISIBLEというよりはGONEな状態)です。
handler.postの中で、タブとは別の場所にあるImageView(その他TextViewなどもありますが)を更新しているのですが、こち
らも更新がかかりません。
タブをActivityにすることもありかな、と思うのですが、タブの数がwebからのレスポンスデータによって不定なので、今のところこのような形を
取っています。。
何かおかしな点があれば是非ご指摘いただければ助かります。
よろしくお願いいたします。
(これからandroidソース追いかけたりしてみます。。)
On 7月12日, 午後12:54, yoshiyuki kanno <
nekota...@gmail.com> wrote:
> 安藤さん
> おつかれさまです。菅野です。
>
> ちょっと時間が取れたのでデバッグしてみましたが、1.x系だと
> おそらく安藤さんが使われているTabContentFactoryによるViewの生成、破棄まわりにバグがありました。
> (破棄する際にView.GONEではなく、View.INVISIBLEになっているため、別のタブに切り替えた際にコンテンツが表示されない)
>
> ただ2系では直っていたので、これじゃーないっぽいですね。
>
> ちなみにTabContentFactoryをどのように使ってますか?
> 自前でViewをコードで作成してるはずですよね。
> このコードに問題があるような気もします。
>
> #可能であれば、他の方法(リソースIDを使う方法か、Activityを使う方法)を試してみては?
>
> 2011年7月12日10:03 daisuke <
do.dais...@gmail.com>:
> ...
>
> もっと読む ≫