Android で一般的にビューにプログラムで要素を追加する最も効率的でクリーンな方法を Web でかなり探していましたが、私がやろうとしていることの方法をまったく見つけられませんでした。推奨される作業方法 (XML ファイルでレイアウトを定義する) を使用したいのですが、次の部分で説明するいくつかの制限があります。
これが私が達成しようとしていることです。デフォルトのビューを表示するアクティビティがあります (setContentView は、上書きされた onCreate メソッドで既に呼び出されています)。
私が読んだことから、いくつかの「ポップアップ」スタイルのメッセージを表示できるようにする必要があります。これには、PopupsとDialogFragmentsの2つの方法があります。後者は、DialogFragment 自体 (DialogFragment を拡張する私のアクティビティから分離されたクラス) で行う特定のカスタマイズがあるため、私にはより適切であるようです。
ここで、ダイアログ フラグメントの XML ドキュメントで単純な線形レイアウトを定義しましたが、問題は、それにスピナーを追加する必要があり、追加する必要がある数が事前にわからないことです (したがって、定義することはできません)。スピナーを手動で XML ファイルに追加します)。
インフレーションについて少し読んだことがありますが、私が理解していることから、ビューをインスタンス化するだけなので、実行時に「表示」および「操作可能」になりますが、私のコードは考慮されているようです。(show メソッドが呼び出されたとき、ビューはスピナーを表示しません)。
活動クラス:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dbSwipeFM = getSupportFragmentManager();
drawView = new DrawingView(this,dbUtils);
[...]
setContentView(drawView);
drawView.requestFocus();
}
public void showColumnSelectionDialogFragment(ArrayList<Shape> shapesColToShow){
new ColumnSelectionDialog().show(dbSwipeFM, "fragment_edit_name");
}
showColumnSelectionDialogFragment メソッドが別のクラスから呼び出されます。
ColumnSelectionDialog クラス [EDIT-last version]:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//View view = inflater.inflate(R.layout.fragment_edit_name, container);
View view = new LinearLayout(getActivity());
DBUtils dbManager = DBUtils.get();
//to count pairs
int pairCount = 0;
LinearLayout horizontalLayoutForTables = new LinearLayout(view.getContext()),
horizontalLayoutForCols = new LinearLayout(view.getContext());
//set layout to be horizontal
horizontalLayoutForTables.setOrientation(LinearLayout.HORIZONTAL);
horizontalLayoutForTables.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
horizontalLayoutForCols.setOrientation(LinearLayout.HORIZONTAL);
horizontalLayoutForCols.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
ArrayList<Shape> dbManagerCurrentlySelectedTables = dbManager.getCurrentRequestSelectedTables();
ArrayList<String> allAvailableTables = new ArrayList<String>();
//((LinearLayout) view).addView(new TextView(view.getContext()));
//get the names of all table elements
for(int k =0; k < dbManager.getCurrentRequestSelectedTables().size(); k++){
allAvailableTables.add(dbManager.getCurrentRequestSelectedTables().get(k).getDbElement().getElementName());
}
for(int i = 0; i < dbManager.getCurrentRequestSelectedTables().size(); i++){
if(pairCount >= 1){
System.out.println("Adding layouts to view");
((LinearLayout) view).addView(horizontalLayoutForTables);
((LinearLayout) view).addView(horizontalLayoutForCols);
horizontalLayoutForTables = new LinearLayout(view.getContext());
horizontalLayoutForCols = new LinearLayout(view.getContext());
pairCount = 0;
}
//create a new spinner containing all the tables
Spinner tableSpinner = new Spinner(view.getContext());
tableSpinner.setAdapter(new SelectionDialogSpinnerAdapter(allAvailableTables));
//create a corresponding spinner for the columns of the current table only.
Spinner tableColumnSpinner = new Spinner(view.getContext());
ArrayList<String> columnNamesOnly = new ArrayList<String>();//get the column names only for the spinner
for(int j = 0; j < dbManagerCurrentlySelectedTables.get(i).getDbElement().getColumns().size(); j++){
columnNamesOnly.add(dbManagerCurrentlySelectedTables.get(i).getDbElement().getColumns().get(j).getColumnName());
}
tableColumnSpinner.setAdapter(new SelectionDialogSpinnerAdapter(columnNamesOnly));
//add to layout
System.out.println("Adding spinners to layout");
horizontalLayoutForTables.addView(tableSpinner);
horizontalLayoutForCols.addView(tableColumnSpinner);
pairCount++;
}
//view = inflater.inflate(R.layout.fragment_edit_name, container);
getDialog().setTitle(R.string.joinSelectTitle);
//view.invalidate();
this.view = view;
return view;
}
このメソッド: getCurrentRequestSelectedTables().size(); エンドユーザーの操作に応じて、さまざまなサイズの結果が返されます。
ビューには、タイトルが表示されるだけです。だから私は考えていました.このビューの新しいアクティビティを作成し、現在のアクティビティからのインテントでそれを呼び出す方が良いですか? または、オンザフライでビューを作成する方法 (アクティビティからコンテキストを渡してインスタンス化する方法) と、プログラムでスピナーを追加する方法があります。
ありがとうございました。[編集]: 注: DialogFragment 内で作成された線形レイアウトも、プログラムで追加する必要があります。XML :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/joinSelectMod"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical" >
</LinearLayout>