Как запустить фрагмент из фрагмента при передаче пользовательского объекта

1

Основываясь на предыдущем вопросе и используя подход, основанный на фрагментах, теперь вопрос состоит в том, как запустить фрагмент из фрагмента при передаче пользовательского объекта данных.

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
}
Теги:
android-fragments

1 ответ

0

Здесь вы должны использовать один 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 
    }
}
  • 0
    Я протестировал этот подход, однако Context был MainActivity, и я хотел иметь List потому что List является родителем формы, MainActivity является корневым дочерним MainActivity (помните, я не хочу, чтобы MainActivity что-то делала). Во-вторых, просмотрите мой Edit 2 и посмотрите теги 1,2,3,4 для основных частей, на которые я хочу, чтобы вы посмотрели. По сути, знания - это один из способов, поэтому они плохо связаны. User знает Form но Form не знает User и она знает что-то только через интерфейс IForm
  • 0
    @Developer Почему вы внедряете IForm в Fragment. Это должно быть реализовано MainActivity.
Показать ещё 13 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню