Как запустить фрагмент из фрагмента при передаче пользовательского объекта - PullRequest
0 голосов
/ 11 апреля 2019

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

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
}

1 Ответ

0 голосов
/ 11 апреля 2019

Здесь вы должны использовать один CallBack / Interface для подключения и воспроизведения с двумя фрагментами.

Сначала напишите один интерфейс с методом, который будет выполнять эту работу, как показано ниже:

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 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...