0

Android でマスター詳細フロー テンプレートを使用しています。そこにあるTextViewのフォントサイズと色を設定するために、アプリの起動時にプログラムでリスト内の項目にアクセスしたいと考えています。onResume (ItemListActivity または ItemListFragment) 内にコーディングすると、ListView は null ではありませんが、3 つの TextView (ListView の子) は null になります。

public void updateActivity( )
{
 ViewGroup leftPane = ( ViewGroup ) findViewById( R.id.item_list );
 FrameLayout frameLayout = ( FrameLayout ) leftPane.getChildAt( 0 );
 FrameLayout frameLayout2 = ( FrameLayout ) frameLayout.getChildAt( 1 );
 ListView listView = ( ListView ) frameLayout2.getChildAt( 1 );  // listView NOT null
 TextView item0 = ( TextView ) listView.getChildAt( 0 ); // item0 is NULL !!!!!
}

(汚い) 修正として ItemListActivity 内にこのコードを思いつきましたが、それが常に機能し、デバイスに依存しないかどうかはわかりません。

public View onCreateView( String name, Context context, AttributeSet attrs ) 
{
 // started is an int instance variable, initialized at 0
 Log.w( "MA", "Inside Activity:onCreateView, started =  " + started ); 
 // if started <= 40 ==> item0 is NULL inside updateActivity 
 if( started == 41) // ==> item0 NOT null inside updateActivity 
   updateActivity( );
 started++;
 return super.onCreateView( name, context, attrs );
}

それはうまくいきますが、私は(はるかに)より良い解決策を探しています。LogCat の出力は次のとおりです (48 で停止します)。

関連するさまざまなライフサイクルメソッドのインターリーブされた実行があるようです。メソッドが実行される前にすべてのビューがインスタンス化されていることを保証するメソッド内でコーディングする方法が必要です。Activity、FragmentActivity、ListFragment、および Fragment クラスの多くのメソッドをオーバーライドしようとしました。TextViews (ListView の子) は、これらすべてのメソッド内で NULL です。ちなみに、他の TextViews は、開始が 41 の場合は NULL のままです。2 番目の TextView は開始が 43 の場合は NOT null になり、開始が 45 の場合は 3 番目の TextView は NOT null になります。何か考えはありますか? 助けてくれてありがとう。

......
05-16 19:27:36.460: W/MA(3155): Inside Activity:onCreateView, started =  37
05-16 19:27:36.460: W/MA(3155): Inside Activity:onCreateView, started =  38
05-16 19:27:36.460: W/MA(3155): Inside ItemListActivity:onResume
05-16 19:27:36.460: W/MA(3155): Inside ItemListFragment:onResume
05-16 19:27:36.484: W/MA(3155): Inside Activity:onCreateView, started =  39
05-16 19:27:36.484: W/MA(3155): Inside Activity:onCreateView, started =  40
05-16 19:27:36.632: W/MA(3155): Inside Activity:onCreateView, started =  41
05-16 19:27:36.632: W/MA(3155): Inside checkActivity
05-16 19:27:36.632: W/MA(3155): Inside Activity:onCreateView, started =  42
05-16 19:27:36.640: W/MA(3155): Inside Activity:onCreateView, started =  43
05-16 19:27:36.640: W/MA(3155): Inside Activity:onCreateView, started =  44
05-16 19:27:36.648: W/MA(3155): Inside Activity:onCreateView, started =  45
05-16 19:27:36.656: W/MA(3155): Inside Activity:onCreateView, started =  46
05-16 19:27:36.742: W/MA(3155): Inside Activity:onCreateView, started =  47
05-16 19:27:36.742: W/MA(3155): Inside Activity:onCreateView, started =  48
4

1 に答える 1

0

これを実現するには、カスタム アダプターを実装する必要があります。アクティビティからonCreateのオブジェクトを作成し、にCustomAdapter渡します。list of dataconstructor

内部では、各行のインフレータブル レイアウトCustomAdapterをオーバーライドする必要があります(ここでは を呼び出す必要があります)。データとof に基づいています。getView()findViewById(id)textView()setFont()setColor()textView

于 2013-05-17T20:17:21.383 に答える