2016-07-26 11 views
1

のような多くのその他のLinearLayoutを含むLinearLayoutで構成されるダイアログを作成しようとしています。レイアウトxmlファイル内にそれぞれを静的に作成する代わりに、ダイアログに表示するボタンの数が変更されるJSONフィードがあります。私はquestionのように見えます...リニアレイアウトを含む動的ダイアログ

...しかしをDialogに動的に追加する方法がわかりません。それぞれのLinearLayoutボタンのデータは、DialogButtonを表す項目のArrayListに解析されます。

+0

なぜ、relativeLayoutを使用する代わりにLinearLayoutsを使用しようとしていますか? – user3621165

+0

"addView()"を使用して各 "ボタン"をLinearLayoutに追加するのは面倒ですが、それ以外の場合はそれぞれの "ボタン"を前に作成したものに対して相対的に作成する必要があります。 – Ben

答えて

0

通常は、このためにRelativeLayoutを使用する必要があります。

あなたの最後の作成したボタンがどこにあるか、気づくために、次の位置に次のものが新しいレイアウトを作成するようにあまりないパフォーマンスをコストを設定します。 addView()を呼び出すようにしてください。ビューが再度レンダリングされる必要があるたびに、可能な限り少なくします。

しかし、それはLinearLayoutsを追加する必要がありますならば、ここでのサンプルコードは次のとおりです。

LinearLayout linearLayout = new LinearLayout(context); 
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 
linearLayout.setOrientation(LinearLayout.VERTICAL); 
viewGroup.addView(linearLayout); 
+0

ありがとうございますが、私はViewGroupの使い方について少し混乱しています。 viewGroupを設定するにはどうすればよいのですか? – Ben

+0

すべてのレイアウトがViewGroupから拡張されています。ビューグループには、ビューに子があることが記述されています。したがって、LinearLayoutをViewGroupにキャストできます。 - > DialogFragmentを使用して、LinearLayoutを持つXMLを展開します。 LinearLayoutにidを渡します。 inflateした後、 "findViewById"によってXMLからLayoutを取得します。これはあなたの "viewGroup"になります。そこでは他のLinearLayoutsをすべて追加することができます...しかし、以下のinvariantの答えを見てください。 addViewを使用する代わりに、はるかに優れています。 – user3621165

0

ListViewまたはRecyclerViewを使用して、アダプタとそれを制御します。 ダイアログにはDialogFragmentを使用できます。 onCreateDialogメソッドをオーバーライドし、内部にAlertDialogを返します。 AlertDialog.BuilderにはsetViewメソッドがあり、これを使用してリストまたはリサイクル業者を膨らませることができます。次に、ダイアログのフラグメントにアダプタのリファレンスを保持し、レイアウトボタンを動的にロードするために使用します。例えば

public class WebsitePickerDialogFragment extends DialogFragment { 

Adapter adapter = new YourRecyclerViewAdapter(); 

@NonNull 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    final RecyclerView contentView = LayoutInflater.from(getContext()).inflate(... 
    contentView.setAdapter(adapter); 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setView(contentView); 
    return builder.create(); 
    } 
} 

あなたが行動をスクロールしたくない場合は、まだListViewのようなLinearLayoutを使用していますhttps://github.com/frankiesardo/LinearListView libのように、任意のアダプタビューでこのパターンを使用することができます。

+0

私はこれを試してみますが、アダプターで何が起こっているかについて、あなたが知ることができる洞察はありますか? – Ben

+0

@Benこの例を確認してください:http://stacktips.com/tutorials/android/android-recyclerview-example#25-creating-recyclerview-adapter アダプターはデータ(例えばウェブサイトのURIのリスト)を保持する必要がありますURIごとのビューを作成してリサイクラビューに入れることができます。これは非常に一般的なパターンであり、数多くの例を見つけることができます。このアプローチでは、アダプターは動的ビューの管理を担当します。アダプターに正しいデータを入れるだけです。 – maciekjanusz

+0

あなたがリンクした例はとても役に立ちましたが、実際に私のカスタムDialogFragmentを表示するのに問題があったのは最後です。つまり、私のカスタムDialogFragmentを表示させるボタンのonClickに何が必要なのでしょうか?今のところ私が持っているのはFragmentManager fm = getSupportFragmentManager()です。 DynamicDialogFrag alertDialog =(DynamicDialogFrag)DynamicDialogFrag.instantiate(this、 ""); alertDialog.show(fm、 "tag"); これはあまり効果がありません。 – Ben

関連する問題