FragmentDialog обмен с Activity ArrayList, Динамические view
FragmentDialog обмен с Activity ArrayList, Динамические view
1) Возникли сложности при обмене между Activity и DialogFragment.
Мне нужно добавлять данные в ArrayList, и потом в Активити хочу из него построить список, с этим вроде проблем нет. Завожу переменные и в Activity и в диалоге, передаю из Диалога в активити через интерфейс, но вот как обратно получить именно ArrayList я не смог разобраться. Ещё мне не нравится момент, что ArrayList сохраняется в Диалоге даже по выходу из него, почему так происходит я вроде понял, жизнь самого диалога соответствует жизни Активити, но у меня получается так что Активити, может жить долго а диалоги каждый раз будут разные. Поэтому мне кажется что можно либо, оставить ArrayList только в самом активити, и обращаться к нему из Диалога, но как это сделать я не смог найти, или оставить в самом Диалоге, но этот вариант мне не очень подходит. Вопрос в том, какой вариант лучше, и как реализовать обмен ArrayList между Активити, и Диалогом.
П.С. Мне нужно чтобы была возможность редактировать данные в диалоге, после добавления.
-Интерфейс на получение данных из диалога в Активити:
[syntax=java5]
@Override
public void onFinishEditGroupNameDialog(String inputText, ArrayList<String> perf_list) {
mTextGroupName.setText(inputText);
performers_list = perf_list;
}
[/syntax]
Основной код диалога... Да я понимаю что это жесть, но я только учусь, вычитал какие то методы пробую использовать)
[syntax=java5]
case "AddGroupNameDialog":
count_performers = 0;
v = inflater.inflate(R.layout.add_group_dialog, container);
mEditGroupName = (EditText)v.findViewById(R.id.txt_group_name);
Button mButtonAddPerformer = (Button)v.findViewById(R.id.btn_add_performer);
mButtonAddPerformer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count_performers++;
TableRow tbR = new TableRow(getDialog().getContext());
final EditText etNew = new EditText(getDialog().getContext());
Button btnNew = new Button(getDialog().getContext());
TableRow.LayoutParams lp = new TableRow.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 1.0f);
etNew.setLayoutParams(lp);
etNew.setSingleLine();
btnNew.setText("Edit");
tbLayout.addView(tbR);
tbR.addView(btnNew);
tbR.addView(etNew);
btnNew.setId(count_performers);
etNew.setId(count_performers);
btnNew.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
performers_list.add(etNew.getText().toString());
Toast.makeText(getDialog().getContext(), "test " + view.getId() + " " + performers_list.size(), Toast.LENGTH_SHORT).show();
}
});
}
});
tbLayout = (TableLayout)v.findViewById(R.id.table_performer_list);
getDialog().setTitle("Group Editor");
mEditGroupName.requestFocus();
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mEditGroupName.setOnEditorActionListener(this);
mEditGroupName.setText(((TextView) getActivity().findViewById(R.id.tv_group)).getText());
break;
[/syntax]
Из кода диалога вытекает второй вопрос.
2) Я динамически добавляю View - Button и EditText в таблицу.
Потом создаю обработчик кнопки, вроде бы я разобрался, как для каждой кнопки сделать свой обработчик, они даже работают. Но я не совсем понял каким образом к каждой кнопки, привязан нужный EditText, я пробовал получать Id которые задавал вручную, но что то не получалось в итоге сделав так:
[syntax=java5]
btnNew.setId(count_performers);
etNew.setId(count_performers);
btnNew.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
performers_list.add(etNew.getText().toString());
Toast.makeText(getDialog().getContext(), "test " + view.getId() + " " + performers_list.size(), Toast.LENGTH_SHORT).show();
}
});
[/syntax]
Всё заработало, но для меня это выглядит как магия...
Если нужно будет, но там всё очень плохо...
Сама Activity
[syntax=java5]
package com.softfireway.windowchange;
import android.app.DialogFragment;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Александр on 16.03.2015.
*/
public class AddSongActivity extends FragmentActivity implements AddSongDialog.EditSongDetailsDialogListener {
private LyricsDataBaseHelper mDatabaseHelper;
private SQLiteDatabase mDatabase;
private DialogFragment mAddSongDialog;
private TextView mTextSongName;
private TextView mTextSongLyrics;
private TextView mTextGroupName;
private List<String> performers_list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_song_activity);
mDatabaseHelper = new LyricsDataBaseHelper(this);
mDatabase = mDatabaseHelper.getWritableDatabase();
mTextSongName = (TextView)findViewById(R.id.tv_song_name);
mTextSongLyrics = (TextView)findViewById(R.id.tv_song_lyrics);
mTextGroupName = (TextView)findViewById(R.id.tv_group);
mAddSongDialog = new AddSongDialog();
}
public void onClickDB(View view) {
switch (view.getId()) {
case R.id.btnAdd:
ContentValues cv = new ContentValues();
cv.put(mDatabaseHelper.SONGNAME, mTextSongName.getText().toString());
cv.put(mDatabaseHelper.LYRICS, mTextSongLyrics.getText().toString());
mDatabase.insert(mDatabaseHelper.TABLE_NAME_SONGS, null, cv);
mTextSongName.setText("");
mTextSongLyrics.setText("");
mTextGroupName.setText("");
Toast.makeText(this, "Song successfully added", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_add_song_name:
mAddSongDialog.show(getFragmentManager(), "AddSongNameDialog");
break;
case R.id.btn_add_song_lyrics:
mAddSongDialog.show(getFragmentManager(), "AddSongLyricsDialog");
break;
case R.id.btn_add_group:
mAddSongDialog.show(getFragmentManager(), "AddGroupNameDialog");
break;
default:
break;
}
}
@Override
public void onFinishEditGroupNameDialog(String inputText, ArrayList<String> perf_list) {
Toast.makeText(this, "Group name " + inputText + perf_list.size(), Toast.LENGTH_SHORT).show();
// ContentValues cvG = new ContentValues();
// cvG.put(mDatabaseHelper.GROUP_NAME, inputText); Вставить в поле mEditGroupName и потом добавлять всё сразу после нажатия на кнопку Add
// mDatabase.insert(mDatabaseHelper.TABLE_NAME_GROUP, mDatabaseHelper.GROUP_NAME, cvG);
mTextGroupName.setText(inputText);
performers_list = perf_list;
}
public List<String> getList() {
return performers_list;
}
@Override
public void onFinishEditSongNameDialog(String inputSongName) {
mTextSongName.setText(inputSongName);
}
@Override
public void onFinishEditSongLyricsDialog(String inputSongLyrics) {
mTextSongLyrics.setText(inputSongLyrics);
}
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("SongName", mTextSongName.getText().toString());
outState.putString("Lyrics", mTextSongLyrics.getText().toString());
outState.putString("Group", mTextGroupName.getText().toString());
}
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mTextSongName.setText(savedInstanceState.getString("SongName"));
mTextSongLyrics.setText(savedInstanceState.getString("Lyrics"));
mTextGroupName.setText(savedInstanceState.getString("Group"));
}
}
[/syntax]
Диалог
[syntax=java5]
package com.softfireway.windowchange;
import android.app.DialogFragment;
import android.os.Bundle;
import android.text.Editable;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
/**
* Created by Александр on 26.03.2015.
*/
public class AddSongDialog extends DialogFragment implements TextView.OnEditorActionListener {
public interface EditSongDetailsDialogListener {
void onFinishEditGroupNameDialog(String inputText, ArrayList<String> perf_list);
void onFinishEditSongNameDialog(String inputSongName);
void onFinishEditSongLyricsDialog(String inputSongLyrics);
}
private EditText mEditSongName;
private EditText mEditSongLyrics;
private EditText mEditGroupName;
private int count_performers;
public ArrayList<String> performers_list = new ArrayList<>();
TableLayout tbLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = null;
Toast.makeText(this.getActivity(), getTag(), Toast.LENGTH_SHORT).show();
switch (getTag()) {
case "AddSongNameDialog":
v = inflater.inflate(R.layout.add_song_name_dialog, container);
mEditSongName = (EditText)v.findViewById(R.id.txt_song_name);
getDialog().setTitle("Song Name Editor");
mEditSongName.requestFocus();
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mEditSongName.setOnEditorActionListener(this);
mEditSongName.setText(((TextView)getActivity().findViewById(R.id.tv_song_name)).getText());
break;
case "AddSongLyricsDialog":
v = inflater.inflate(R.layout.add_song_lyrics_dialog, container);
mEditSongLyrics = (EditText)v.findViewById(R.id.txt_song_lyrics);
getDialog().setTitle("Song Lyrics Editor");
mEditSongLyrics.requestFocus();
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mEditSongLyrics.setOnEditorActionListener(this);
mEditSongLyrics.setText(((TextView)getActivity().findViewById(R.id.tv_song_lyrics)).getText());
break;
case "AddGroupNameDialog":
count_performers = 0;
v = inflater.inflate(R.layout.add_group_dialog, container);
mEditGroupName = (EditText)v.findViewById(R.id.txt_group_name);
Button mButtonAddPerformer = (Button)v.findViewById(R.id.btn_add_performer);
mButtonAddPerformer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count_performers++;
TableRow tbR = new TableRow(getDialog().getContext());
final EditText etNew = new EditText(getDialog().getContext());
Button btnNew = new Button(getDialog().getContext());
TableRow.LayoutParams lp = new TableRow.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 1.0f);
etNew.setLayoutParams(lp);
etNew.setSingleLine();
btnNew.setText("Edit");
tbLayout.addView(tbR);
tbR.addView(btnNew);
tbR.addView(etNew);
btnNew.setId(count_performers);
etNew.setId(count_performers);
btnNew.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
performers_list.add(etNew.getText().toString());
Toast.makeText(getDialog().getContext(), "test " + view.getId() + " " + performers_list.size(), Toast.LENGTH_SHORT).show();
}
});
}
});
tbLayout = (TableLayout)v.findViewById(R.id.table_performer_list);
getDialog().setTitle("Group Editor");
mEditGroupName.requestFocus();
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mEditGroupName.setOnEditorActionListener(this);
mEditGroupName.setText(((TextView) getActivity().findViewById(R.id.tv_group)).getText());
break;
default:
break;
}
return v;
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (EditorInfo.IME_ACTION_DONE == actionId) {
EditSongDetailsDialogListener activity = (EditSongDetailsDialogListener)getActivity();
switch (getTag()) {
case "AddGroupNameDialog":
activity.onFinishEditGroupNameDialog(mEditGroupName.getText().toString(), performers_list) ;
this.dismiss();
break;
case "AddSongLyricsDialog":
activity.onFinishEditSongLyricsDialog(mEditSongLyrics.getText().toString());
this.dismiss();
break;
case "AddSongNameDialog":
activity.onFinishEditSongNameDialog(mEditSongName.getText().toString());
this.dismiss();
break;
default:
break;
}
return true;
}
return false;
}
}
[/syntax]
Мне нужно добавлять данные в ArrayList, и потом в Активити хочу из него построить список, с этим вроде проблем нет. Завожу переменные и в Activity и в диалоге, передаю из Диалога в активити через интерфейс, но вот как обратно получить именно ArrayList я не смог разобраться. Ещё мне не нравится момент, что ArrayList сохраняется в Диалоге даже по выходу из него, почему так происходит я вроде понял, жизнь самого диалога соответствует жизни Активити, но у меня получается так что Активити, может жить долго а диалоги каждый раз будут разные. Поэтому мне кажется что можно либо, оставить ArrayList только в самом активити, и обращаться к нему из Диалога, но как это сделать я не смог найти, или оставить в самом Диалоге, но этот вариант мне не очень подходит. Вопрос в том, какой вариант лучше, и как реализовать обмен ArrayList между Активити, и Диалогом.
П.С. Мне нужно чтобы была возможность редактировать данные в диалоге, после добавления.
-Интерфейс на получение данных из диалога в Активити:
[syntax=java5]
@Override
public void onFinishEditGroupNameDialog(String inputText, ArrayList<String> perf_list) {
mTextGroupName.setText(inputText);
performers_list = perf_list;
}
[/syntax]
Основной код диалога... Да я понимаю что это жесть, но я только учусь, вычитал какие то методы пробую использовать)
[syntax=java5]
case "AddGroupNameDialog":
count_performers = 0;
v = inflater.inflate(R.layout.add_group_dialog, container);
mEditGroupName = (EditText)v.findViewById(R.id.txt_group_name);
Button mButtonAddPerformer = (Button)v.findViewById(R.id.btn_add_performer);
mButtonAddPerformer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count_performers++;
TableRow tbR = new TableRow(getDialog().getContext());
final EditText etNew = new EditText(getDialog().getContext());
Button btnNew = new Button(getDialog().getContext());
TableRow.LayoutParams lp = new TableRow.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 1.0f);
etNew.setLayoutParams(lp);
etNew.setSingleLine();
btnNew.setText("Edit");
tbLayout.addView(tbR);
tbR.addView(btnNew);
tbR.addView(etNew);
btnNew.setId(count_performers);
etNew.setId(count_performers);
btnNew.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
performers_list.add(etNew.getText().toString());
Toast.makeText(getDialog().getContext(), "test " + view.getId() + " " + performers_list.size(), Toast.LENGTH_SHORT).show();
}
});
}
});
tbLayout = (TableLayout)v.findViewById(R.id.table_performer_list);
getDialog().setTitle("Group Editor");
mEditGroupName.requestFocus();
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mEditGroupName.setOnEditorActionListener(this);
mEditGroupName.setText(((TextView) getActivity().findViewById(R.id.tv_group)).getText());
break;
[/syntax]
Из кода диалога вытекает второй вопрос.
2) Я динамически добавляю View - Button и EditText в таблицу.
Потом создаю обработчик кнопки, вроде бы я разобрался, как для каждой кнопки сделать свой обработчик, они даже работают. Но я не совсем понял каким образом к каждой кнопки, привязан нужный EditText, я пробовал получать Id которые задавал вручную, но что то не получалось в итоге сделав так:
[syntax=java5]
btnNew.setId(count_performers);
etNew.setId(count_performers);
btnNew.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
performers_list.add(etNew.getText().toString());
Toast.makeText(getDialog().getContext(), "test " + view.getId() + " " + performers_list.size(), Toast.LENGTH_SHORT).show();
}
});
[/syntax]
Всё заработало, но для меня это выглядит как магия...
Если нужно будет, но там всё очень плохо...
Сама Activity
[syntax=java5]
package com.softfireway.windowchange;
import android.app.DialogFragment;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Александр on 16.03.2015.
*/
public class AddSongActivity extends FragmentActivity implements AddSongDialog.EditSongDetailsDialogListener {
private LyricsDataBaseHelper mDatabaseHelper;
private SQLiteDatabase mDatabase;
private DialogFragment mAddSongDialog;
private TextView mTextSongName;
private TextView mTextSongLyrics;
private TextView mTextGroupName;
private List<String> performers_list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_song_activity);
mDatabaseHelper = new LyricsDataBaseHelper(this);
mDatabase = mDatabaseHelper.getWritableDatabase();
mTextSongName = (TextView)findViewById(R.id.tv_song_name);
mTextSongLyrics = (TextView)findViewById(R.id.tv_song_lyrics);
mTextGroupName = (TextView)findViewById(R.id.tv_group);
mAddSongDialog = new AddSongDialog();
}
public void onClickDB(View view) {
switch (view.getId()) {
case R.id.btnAdd:
ContentValues cv = new ContentValues();
cv.put(mDatabaseHelper.SONGNAME, mTextSongName.getText().toString());
cv.put(mDatabaseHelper.LYRICS, mTextSongLyrics.getText().toString());
mDatabase.insert(mDatabaseHelper.TABLE_NAME_SONGS, null, cv);
mTextSongName.setText("");
mTextSongLyrics.setText("");
mTextGroupName.setText("");
Toast.makeText(this, "Song successfully added", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_add_song_name:
mAddSongDialog.show(getFragmentManager(), "AddSongNameDialog");
break;
case R.id.btn_add_song_lyrics:
mAddSongDialog.show(getFragmentManager(), "AddSongLyricsDialog");
break;
case R.id.btn_add_group:
mAddSongDialog.show(getFragmentManager(), "AddGroupNameDialog");
break;
default:
break;
}
}
@Override
public void onFinishEditGroupNameDialog(String inputText, ArrayList<String> perf_list) {
Toast.makeText(this, "Group name " + inputText + perf_list.size(), Toast.LENGTH_SHORT).show();
// ContentValues cvG = new ContentValues();
// cvG.put(mDatabaseHelper.GROUP_NAME, inputText); Вставить в поле mEditGroupName и потом добавлять всё сразу после нажатия на кнопку Add
// mDatabase.insert(mDatabaseHelper.TABLE_NAME_GROUP, mDatabaseHelper.GROUP_NAME, cvG);
mTextGroupName.setText(inputText);
performers_list = perf_list;
}
public List<String> getList() {
return performers_list;
}
@Override
public void onFinishEditSongNameDialog(String inputSongName) {
mTextSongName.setText(inputSongName);
}
@Override
public void onFinishEditSongLyricsDialog(String inputSongLyrics) {
mTextSongLyrics.setText(inputSongLyrics);
}
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("SongName", mTextSongName.getText().toString());
outState.putString("Lyrics", mTextSongLyrics.getText().toString());
outState.putString("Group", mTextGroupName.getText().toString());
}
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mTextSongName.setText(savedInstanceState.getString("SongName"));
mTextSongLyrics.setText(savedInstanceState.getString("Lyrics"));
mTextGroupName.setText(savedInstanceState.getString("Group"));
}
}
[/syntax]
Диалог
[syntax=java5]
package com.softfireway.windowchange;
import android.app.DialogFragment;
import android.os.Bundle;
import android.text.Editable;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
/**
* Created by Александр on 26.03.2015.
*/
public class AddSongDialog extends DialogFragment implements TextView.OnEditorActionListener {
public interface EditSongDetailsDialogListener {
void onFinishEditGroupNameDialog(String inputText, ArrayList<String> perf_list);
void onFinishEditSongNameDialog(String inputSongName);
void onFinishEditSongLyricsDialog(String inputSongLyrics);
}
private EditText mEditSongName;
private EditText mEditSongLyrics;
private EditText mEditGroupName;
private int count_performers;
public ArrayList<String> performers_list = new ArrayList<>();
TableLayout tbLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = null;
Toast.makeText(this.getActivity(), getTag(), Toast.LENGTH_SHORT).show();
switch (getTag()) {
case "AddSongNameDialog":
v = inflater.inflate(R.layout.add_song_name_dialog, container);
mEditSongName = (EditText)v.findViewById(R.id.txt_song_name);
getDialog().setTitle("Song Name Editor");
mEditSongName.requestFocus();
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mEditSongName.setOnEditorActionListener(this);
mEditSongName.setText(((TextView)getActivity().findViewById(R.id.tv_song_name)).getText());
break;
case "AddSongLyricsDialog":
v = inflater.inflate(R.layout.add_song_lyrics_dialog, container);
mEditSongLyrics = (EditText)v.findViewById(R.id.txt_song_lyrics);
getDialog().setTitle("Song Lyrics Editor");
mEditSongLyrics.requestFocus();
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mEditSongLyrics.setOnEditorActionListener(this);
mEditSongLyrics.setText(((TextView)getActivity().findViewById(R.id.tv_song_lyrics)).getText());
break;
case "AddGroupNameDialog":
count_performers = 0;
v = inflater.inflate(R.layout.add_group_dialog, container);
mEditGroupName = (EditText)v.findViewById(R.id.txt_group_name);
Button mButtonAddPerformer = (Button)v.findViewById(R.id.btn_add_performer);
mButtonAddPerformer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count_performers++;
TableRow tbR = new TableRow(getDialog().getContext());
final EditText etNew = new EditText(getDialog().getContext());
Button btnNew = new Button(getDialog().getContext());
TableRow.LayoutParams lp = new TableRow.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 1.0f);
etNew.setLayoutParams(lp);
etNew.setSingleLine();
btnNew.setText("Edit");
tbLayout.addView(tbR);
tbR.addView(btnNew);
tbR.addView(etNew);
btnNew.setId(count_performers);
etNew.setId(count_performers);
btnNew.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
performers_list.add(etNew.getText().toString());
Toast.makeText(getDialog().getContext(), "test " + view.getId() + " " + performers_list.size(), Toast.LENGTH_SHORT).show();
}
});
}
});
tbLayout = (TableLayout)v.findViewById(R.id.table_performer_list);
getDialog().setTitle("Group Editor");
mEditGroupName.requestFocus();
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mEditGroupName.setOnEditorActionListener(this);
mEditGroupName.setText(((TextView) getActivity().findViewById(R.id.tv_group)).getText());
break;
default:
break;
}
return v;
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (EditorInfo.IME_ACTION_DONE == actionId) {
EditSongDetailsDialogListener activity = (EditSongDetailsDialogListener)getActivity();
switch (getTag()) {
case "AddGroupNameDialog":
activity.onFinishEditGroupNameDialog(mEditGroupName.getText().toString(), performers_list) ;
this.dismiss();
break;
case "AddSongLyricsDialog":
activity.onFinishEditSongLyricsDialog(mEditSongLyrics.getText().toString());
this.dismiss();
break;
case "AddSongNameDialog":
activity.onFinishEditSongNameDialog(mEditSongName.getText().toString());
this.dismiss();
break;
default:
break;
}
return true;
}
return false;
}
}
[/syntax]
Re: FragmentDialog обмен с Activity ArrayList, Динамические
и чего вы это динамическое добавление так любите.. откуда вы это все берете-то? Тока начал программировать - на второй день уже динамически чета на экран добавляет..
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: FragmentDialog обмен с Activity ArrayList, Динамические
Ну у меня такая необходимость, что есть возможность добавить неограниченное число элементов, и как кроме динамически я не представляю...

Вот что примерно я хотел сделать, по нажатию на добавить(+) добавляется новое TextView и кнопка сохранения введённых данных, была ещё идея сделать отдельный диалог на каждое добавление, скорее всего так и сделаю, но потом всё равно надо динамически создавать элементы чтобы отобразить что они добавились, и при необходимости их отредактировать...

Вот что примерно я хотел сделать, по нажатию на добавить(+) добавляется новое TextView и кнопка сохранения введённых данных, была ещё идея сделать отдельный диалог на каждое добавление, скорее всего так и сделаю, но потом всё равно надо динамически создавать элементы чтобы отобразить что они добавились, и при необходимости их отредактировать...
Re: FragmentDialog обмен с Activity ArrayList, Динамические
листьвью - это и есть НЕОГРАНИЧЕННОЕ. И кнопки - все это тоже стандартная задача (которая чуть ли не во всех приложениях используется), я просто уже не знаю как объяснить. ЗАчем себе жизнь усложнять? Тут в уроках все это есть. Причем добавяется сколько угодно элементов - одна команда и все на экране обновилось.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: FragmentDialog обмен с Activity ArrayList, Динамические
Действительно, да я уже прошёл эти уроки, просто было много идей как это реализовать а вот про ListView совсем не подумал, тем более уже и в проекте использовал не раз) Спасибо за идею, и с реализацией проще гораздо, и выглядит лучше(Не загружено кнопками), редактирование сделаю через OnItemClick() и буду вызывать диалог с EditText, без всяких дополнительных кнопок.
Тогда этот вопрос отпадает, разве что на будущее кто пояснит если вдруг всё же полезу в эти дебри)
Остаётся вопрос с обменом ArrayList между Активити, и Диалогом...
Или один List в самой Активити, и с ней работать из Диалога, но не получается такой вариант пока что...
Или и там и там, и передавать лист туда-сюда для редактирования и отображения...
Тогда этот вопрос отпадает, разве что на будущее кто пояснит если вдруг всё же полезу в эти дебри)
Остаётся вопрос с обменом ArrayList между Активити, и Диалогом...
Или один List в самой Активити, и с ней работать из Диалога, но не получается такой вариант пока что...
Или и там и там, и передавать лист туда-сюда для редактирования и отображения...
Re: FragmentDialog обмен с Activity ArrayList, Динамические
да, я тоже диалогом редактирование делаю
и опять же - читай уроки по передаче данных в диалог и получение данных из диалога. Как это не получается работать с одним списком? еще как получается.
При открытии диалога передавай туда данные из списка, при закрытии (подтверждении изменений) - передавай обратно и меняй данные, обновляй список. Можно по-разному делать, сразу в диалоге данные менять, но это лучше когда или список где-то хранится, либо база данных.
и опять же - читай уроки по передаче данных в диалог и получение данных из диалога. Как это не получается работать с одним списком? еще как получается.
При открытии диалога передавай туда данные из списка, при закрытии (подтверждении изменений) - передавай обратно и меняй данные, обновляй список. Можно по-разному делать, сразу в диалоге данные менять, но это лучше когда или список где-то хранится, либо база данных.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: FragmentDialog обмен с Activity ArrayList, Динамические
Ну не уверен конечно, сейчас уже не успею разобраться, завтра посмотрю, если всё будет окей, то здорово, если нет то ещё отпишусь)
Как я прочитал, из активити в Fragment можно передать через set/get Arguments. Пока сделал, так вроде работает но не проверял что там, всё переписывать надо, такой страх развёл с динамическими кнопками просто ужас)
В Активити.
[syntax=java5]
Bundle bundle = new Bundle();
bundle.putStringArrayList("perf_list", performers_list);
mAddSongDialog.setArguments(bundle);
mAddSongDialog.show(getFragmentManager(), "AddGroupNameDialog");
[/syntax]
В DialogFragment
[syntax=java5]
performers_list = getArguments().getStringArrayList("perf_list");
[/syntax]
В итоге у меня есть ArrayList и в Activity и в DialogFragment.
У меня получается что открываю один диалог, а потом в нём ещё 1, уже для редактирования.
У меня всё в итоге заносится в базу данных, но это по завершению работы активити, так что в момент работы с полученными данными только через ArrayList.
Как я прочитал, из активити в Fragment можно передать через set/get Arguments. Пока сделал, так вроде работает но не проверял что там, всё переписывать надо, такой страх развёл с динамическими кнопками просто ужас)
В Активити.
[syntax=java5]
Bundle bundle = new Bundle();
bundle.putStringArrayList("perf_list", performers_list);
mAddSongDialog.setArguments(bundle);
mAddSongDialog.show(getFragmentManager(), "AddGroupNameDialog");
[/syntax]
В DialogFragment
[syntax=java5]
performers_list = getArguments().getStringArrayList("perf_list");
[/syntax]
В итоге у меня есть ArrayList и в Activity и в DialogFragment.
У меня получается что открываю один диалог, а потом в нём ещё 1, уже для редактирования.
У меня всё в итоге заносится в базу данных, но это по завершению работы активити, так что в момент работы с полученными данными только через ArrayList.
Re: FragmentDialog обмен с Activity ArrayList, Динамические
и база данных есть? о мама мия
зачем тогда массивы? общий случай - курсор. И в андроиде принято, чтоб данные СРАЗУ же заносились в БД, т.е. записывались. "завершение" работы активити - опасная штука, можешь прошляпить этот момент и ничего не запишется.
Я записываю данные в бд прямо в диалоге по кнопке ОК. Затем, когда возвращаешься в список - он автоматом обновляется.
В общем, намудрил.
зачем тогда массивы? общий случай - курсор. И в андроиде принято, чтоб данные СРАЗУ же заносились в БД, т.е. записывались. "завершение" работы активити - опасная штука, можешь прошляпить этот момент и ничего не запишется.
Я записываю данные в бд прямо в диалоге по кнопке ОК. Затем, когда возвращаешься в список - он автоматом обновляется.
В общем, намудрил.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: FragmentDialog обмен с Activity ArrayList, Динамические
в диалог при этом нужно передавать только 1 штуку - _id таблицы.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198