Основываясь на предыдущем вопросе и используя подход, основанный на фрагментах, теперь вопрос состоит в том, как запустить фрагмент из фрагмента при передаче пользовательского объекта данных.
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
}
Здесь вы должны использовать один CallBack/интерфейс для подключения и игры с двумя фрагментами.
Сначала напишите один интерфейс с методом, который будет выполнять эту работу, как показано ниже:
public interface ItemClickListener extends Parcelable{
void onItemClick(FormData data);
}
Затем инициализируйте этот интерфейс в обоих ваших фрагментах в OnAttach()
:
public class UserFragment extends Fragment {
private ItemClickListener onItemClick;
@Override
public void onAttach(Context context) {
super.onAttach(context);
onItemClick= (ItemClickListener) context;
}
Используйте его внутри onItemClick для передачи значения:
userList.setOnItemClickListener((adapterView, view1, i, l) -> {
Log.d("UserList", "onItemClick: " + i);
// how to launch Form.java Fragment while passing users[i]
onItemClick.onItemClick(adapterView.getItemAtPosition(i);
});
}
Затем внедрите этот интерфейс в свою деятельность.
public class MainActivity extends AppCompatActivity implements ItemClickListener{
@override
public void onItemClick(FormData data){
//do your stuff here with form data or whatever your object
//Start Form Fragment and send the data through Bundle
//https://stackoverflow.com/questions/12739909/send-data-from-activity-to-fragment-in-android
}
}
Context
был MainActivity, и я хотел иметьList
потому что List является родителем формы,MainActivity
является корневым дочернимMainActivity
(помните, я не хочу, чтобы MainActivity что-то делала). Во-вторых, просмотрите мой Edit 2 и посмотрите теги 1,2,3,4 для основных частей, на которые я хочу, чтобы вы посмотрели. По сути, знания - это один из способов, поэтому они плохо связаны.User
знаетForm
ноForm
не знаетUser
и она знает что-то только через интерфейсIForm