2017-11-07 29 views
2

これは問題ではありませんが、より効率的な質問です。私は自分のAndroid AppのXMLレイアウトに複数のTextView(2つ)を持っています。私の質問は、私は複数のTextViews、findViewByIdを1行で複数のTextViewsを選択することができますか?FindViewByIdは1行に複数回表示されます

このは私の質問に有効ですか?

TextView title, darkThemeTitle = findViewById(R.id.title); findViewById(R.id.darkThemeTitle); 
+2

ただ興味がありますが、なぜそれは1行で必要ですか?倍数ではなく単一行の主な違いは何ですか? –

+0

コードの量を最小限にするだけです – flash76

+0

コードをメソッドに分割するには、メインコードの外側でfindview-codeを移動し、折り畳みを使用します。私は垂直方向と比較して水平方向のコーディングの利点を理解できません。あなたの画面とIDEは垂直に設計されています。私が実際にお勧めできるもの - 動的バインディングを使用してください、詳細は私の答えを見てください。 –

答えて

1

コードにTextView title, darkThemeTitle = findViewById(R.id.title); findViewById(R.id.darkThemeTitle);を使用するとします。

  • この行TextView title, darkThemeTitle = (TextView) findViewById(R.id.title);変数「タイトル」が。だからtitleを初期化されていない可能性があることを示したコードでを初期化することはありません。

  • そしてfindViewById(R.id.tab_layout);は、あなたのコード内でビューを返します.ANDそれはあなたのコードでdarkThemeTitleを返すことはありません。

あなたはこのようにすることができます。

TextView title = (TextView) findViewById(R.id.title); TextView darkThemeTitle = (TextView) findViewById(R.id.darkThemeTitle); 

別の方法

TextView title = null, darkThemeTitle = null; 

TextView[] textViews = {title, darkThemeTitle}; 
Integer[] ids = {R.id.title, R.id.darkThemeTitle}; 

for (int i = 0; i < textViews.length; i++) { 
    textViews[i] = (TextView) findViewById(ids[i]); 
} 
0

あなたはButterKnifeを使ってみましたか?このライブラリは依存性注入に役立ちますので、findViewByIdについて心配する必要はありません。 @BindView(view_id)と、バインドする変数のタイプと名前を呼び出してください。

@BindView(R.id.title) 
TextView title; 
@BindView(R.id.darkThemeTitle) 
TextView darkThemeTitle; 

あなたbuild.gradleファイルに

compile 'com.jakewharton:butterknife:8.8.1' 

を依存関係を追加して、唯一の推薦を使用することですあなたの活動のonCreate

ButterKnife.bind(this); 
+0

ありがとうございますが、このようなビューをキャストすることは可能ですか? 'TextView title、darkThemeTitle = findViewById(R.id.title); findViewById(R.id.darkThemeTitle); ' – flash76

+0

すべてのコントロールがインスタンス化された後、' ButterKnife.bind(this) 'は実行されませんか? – flash76

+0

'Activity'の中で' ButterKife.bind() 'を使用している場合、これは' ViewHolder'や 'Fragment'のように複雑な場合に' onCreate'で使うことができます。 'ButterKnife(this、parentView/activityInstance) 'を実行します。 'parentView'を使うと、新しいレイアウトを展開したり、' activityInstance'を渡すことができます。 –

1

でbindメソッドを呼び出す必要があることを忘れないでくださいビューを見つけるためのテンプレートID:

TextView[] themedViews = new int[NUMBER_OF_THEMES]; 
for (int k = 0; k < NUMBER_OF_THEMES; k++) 
    themedViews[k] = findViewById(context.getResources().getIdentifier("some_prefix" + String.valueOf(k), "id", packageName)); 

これは、現在のアクティビティのすべてのビューを検出します。

parent.findViewByIdを使用すると、指定したビューのサブビューを見つけることができます。

+0

これは、XMLレイアウトのすべてのビューをインスタンス化するでしょうか? – flash76

+0

答えを更新しました。私の以前のコードは、ビューのIDのみを検索しました。ビューを見つけるために変更しました。 –

+0

ところで、私はテーマのコントロールを見つけるためにこれを使用することはお勧めしません。最善の解決策:findViewByIdコマンドをヘルパークラスの分離されたメソッドに移動します。 –

1

それは読むために、あなたに多くの時間タイピングを保存していない他のプログラマのためのより難しいので、私はこれをやってからあなたを落胆。使用:

TextView title = findViewById(R.id.title), darkThemeTitle = findViewById(R.id.darkThemeTitle); 
関連する問題