在 PlaceholderFragment 中收集数据并将其发送到 Activity
collect data in PlaceholderFragment and send it to Activity
我正在编写一个游戏,每个玩家都有自己的选项卡。每个 Tab 都是 PlaceholderFragment 的一个实例。我认为实现标签和片段的动态计数很容易,但现在我真的不知道如何从每个实例获取输入数据到 ParentActivity。
也许我应该提到我想使用 java 7(SDK 版本最小 < 24)
我使用的界面是正确的,但问题是,用户需要按 Activity 中的菜单项 "save data" 来保存数据,但界面已定义在片段中。
对我来说重要的是我首先从每个片段中收集数据然后保存它因为之后我想将给定的数据列表转换为一个字符串并将这个字符串保存在数据库中(否则我不会保存整个游戏,但只是一个玩家)。
我知道我可以在数据库中定义更多的列,但我有一个动态的玩家数和每个玩家的回合数。
将数组转换为字符串:
private void mergeAll(ArrayList<ArrayList<Integer>> list) {
ArrayList<String> wholeList = new ArrayList<>();
for(ArrayList<Integer> partList : list) {
for(int i = 0; i < partList.size(); i++) {
wholeList.add(partList.get(i).toString());
}
}
StringBuilder sb = new StringBuilder();
for(String s : wholeList) {
sb.append(s);
sb.append("\t");
}
playerAsString = sb.toString();
}
片段接口
public static PlaceholderFragment newInstance(int index) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle bundle = new Bundle();
bundle.putInt("player", index);
fragment.setArguments(bundle);
return fragment;
}
public interface FragmentToActivity {
void communicate(String data);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mCallback = (FragmentToActivity) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()
+ " must implement FragmentToActivity");
}
}
@Override
public void onDetach() {
mCallback = null;
super.onDetach();
}
private void sendData(String comm)
{
mCallback.communicate(comm);
}
Activity:
@Override
public void communicate(String data) {
Log.i("got it", data);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_saveData:
//here i want to collect the strings from each fragment and save it to the database
return true;
...
}
return super.onOptionsItemSelected(item);
}
还有其他办法吗?
据我所知,PlaceholderFragments 没有片段标签或 ID,所以我可以循环并获取我需要的字符串。
有办法做到这一点:
@Override
public void communicate(ArrayList<ArrayList<Integer>> data) {
for(int i = 0; i < numPlayer; i++) {
if(viewPager.getCurrentItem() == i) {
oneGame.set(i, data);
}
}
}
activity中的这个方法从每个片段中收集数据并将其存储在 ArrayList 中,之后我使用这个 ArrayList。
我正在编写一个游戏,每个玩家都有自己的选项卡。每个 Tab 都是 PlaceholderFragment 的一个实例。我认为实现标签和片段的动态计数很容易,但现在我真的不知道如何从每个实例获取输入数据到 ParentActivity。 也许我应该提到我想使用 java 7(SDK 版本最小 < 24)
我使用的界面是正确的,但问题是,用户需要按 Activity 中的菜单项 "save data" 来保存数据,但界面已定义在片段中。
对我来说重要的是我首先从每个片段中收集数据然后保存它因为之后我想将给定的数据列表转换为一个字符串并将这个字符串保存在数据库中(否则我不会保存整个游戏,但只是一个玩家)。
我知道我可以在数据库中定义更多的列,但我有一个动态的玩家数和每个玩家的回合数。
将数组转换为字符串:
private void mergeAll(ArrayList<ArrayList<Integer>> list) {
ArrayList<String> wholeList = new ArrayList<>();
for(ArrayList<Integer> partList : list) {
for(int i = 0; i < partList.size(); i++) {
wholeList.add(partList.get(i).toString());
}
}
StringBuilder sb = new StringBuilder();
for(String s : wholeList) {
sb.append(s);
sb.append("\t");
}
playerAsString = sb.toString();
}
片段接口
public static PlaceholderFragment newInstance(int index) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle bundle = new Bundle();
bundle.putInt("player", index);
fragment.setArguments(bundle);
return fragment;
}
public interface FragmentToActivity {
void communicate(String data);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mCallback = (FragmentToActivity) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()
+ " must implement FragmentToActivity");
}
}
@Override
public void onDetach() {
mCallback = null;
super.onDetach();
}
private void sendData(String comm)
{
mCallback.communicate(comm);
}
Activity:
@Override
public void communicate(String data) {
Log.i("got it", data);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_saveData:
//here i want to collect the strings from each fragment and save it to the database
return true;
...
}
return super.onOptionsItemSelected(item);
}
还有其他办法吗? 据我所知,PlaceholderFragments 没有片段标签或 ID,所以我可以循环并获取我需要的字符串。
有办法做到这一点:
@Override
public void communicate(ArrayList<ArrayList<Integer>> data) {
for(int i = 0; i < numPlayer; i++) {
if(viewPager.getCurrentItem() == i) {
oneGame.set(i, data);
}
}
}
activity中的这个方法从每个片段中收集数据并将其存储在 ArrayList 中,之后我使用这个 ArrayList。