Опираясь на предыдущий вопрос и используя подход, основанный на фрагментах, теперь возникает вопрос: Как запустить фрагмент из фрагмента при передаче пользовательского объекта данных
public class MainActivity extends AppCompatActivity {
public User user = new User();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportFragmentManager().beginTransaction()
.replace(R.id.frame_layout, user)
.commit();
}
}
User.java список пользователей
public class User extends Fragment {
ListView userList;
private ArrayList<UserVO> users;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.user_list, container, false); // Inflate the layout for this fragment
userList = view.findViewById(R.id.userList);
users = getUsers(); // ArrayList
userList.setAdapter(new UserAdapter());
userList.setOnItemClickListener((adapterView, view1, i, l) -> {
Log.d("UserList", "onItemClick: " + i);
// how to launch Form.java Fragment while passing users[i]
});
return view;
}
class UserAdapter extends BaseAdapter {
@Override
public int getCount() {
return users.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = LayoutInflater.from(viewGroup.getContext()).inflate(android.R.layout.simple_list_item_1, viewGroup,false);
((TextView) view.findViewById(android.R.id.text1)).setText(users.get(i).givenName());
return view;
}
}
}
Form.java , предназначенный для отображения пользовательских данных в форме для целей обновления.
public class Form extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.form, container, false);
return view;
}
}
Q1.В User.java у меня есть заполнитель в комментариях, спрашивающий, как создать экземпляр Form.java
при передаче users[i]
(пользовательский объект с полями)
Q2.Пожалуйста, посмотрите, есть ли что-то не так с подходом в MainActivity.java
, я видел другой подход с методом add, и я использую здесь замену, не уверен, какой именно здесь.
Попытка
Я добавил следующий код и не доволен результатом, он перекрывается со списком, я хочу, чтобы форма имела свое собственное представление и поместила в стек,Кнопка Назад должна вернуть пользователя в список.
Form form = new Form();
getFragmentManager().beginTransaction()
.add(R.id.frame_layout, form)
.commit();
Редактировать 2 Для проверки - на основе ответа.
public interface IForm { // 1
void update(UserObject userObject);
}
public class User extends Fragments implements IForm { // 2
private Form form = new Form();
void update(UserObject userObject) {
// update user list with updated object.
}
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.user_list, container, false); // Inflate the layout for this fragment
userList = view.findViewById(R.id.userList);
users = getUsers(); // ArrayList
form.delegate = this; // 3
userList.setOnItemClickListener((adapterView, view1, i, l) -> {
Log.d("UserList_archive", "onItemClick: " + i);
form.userData = users[i]; // 4
getFragmentManager().beginTransaction()
.replace(R.id.frame_layout, form)
.addToBackStack(null)
.commit();
});
return view;
}
public class Form {
public IForm delegate; // 5
public UserObject userObject; // see 4 - to display data in the form
}