Передача данных из Activity во Fragment ничего не показывает - PullRequest
1 голос
/ 09 июня 2019

У меня есть активность, в которой находится фрагмент.С этого фрагмента я запускаю другую активность (если нажата определенная кнопка).Это задание представляет собой представление Recycler, в котором выбирается изображение, и я хочу получить этот идентификатор изображения и передать его моему фрагменту (чтобы он мог отображать правильное изображение).Я пытался сделать тест для передачи данных, но он не работает.ImageGallery.java <- Активность, где изображения: </p>

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_gallery);
        RecyclerView recyclerView = (RecyclerView)findViewById(R.id.imagegallery);
        recyclerView.setHasFixedSize(true);
        images = new ArrayList<>();
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(),2);
        recyclerView.setLayoutManager(layoutManager);
        for (int i = 0; i < IMAGE_IDS.length; i++) {
            images.add(new ImageListHandler(IMAGE_IDS[i]));
        }
        GalleryAdapter adapter = new GalleryAdapter(getApplicationContext(), images);
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(onItemClickListener);
        Bundle bundle = new Bundle();
        bundle.putString("test", "hello");
        GameFragment9 fragobj = new GameFragment9();
        fragobj.setArguments(bundle);

    }

GameFragment9.java <- Фрагмент, где я ожидаю получить идентификатор изображения (в данном случае, очевидно, просто приветственное сообщение) </p>

@Override
public void onResume() {
    super.onResume();
    Bundle bundle = this.getArguments();
    if (bundle != null){
        myValue = bundle.getString("test");
    }

    Toast.makeText(getActivity(), myValue, Toast.LENGTH_SHORT).show();
}

GameActivity9.java <- содержит фрагмент, который запускает действие. </p>

открытый класс. GameActivity9 расширяет AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game9);
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        GameFragment9 fm1 = new GameFragment9();
        PictureHolder9Fragment fm2 = new PictureHolder9Fragment();
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
            fragmentManager.beginTransaction().replace(R.id.fragment9One, fm1).commit();
        }
        else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
            fragmentManager.beginTransaction().replace(R.id.fragment9Oneh, fm1).commit();
            fragmentManager.beginTransaction().replace(R.id.fragment9Twoh, fm2).commit();
        }
    }
}

. Я добавил оператор if, поскольку в противном случае я получил исключение NullPointerException.Фактический код очень большой, поэтому я привожу здесь только часть, участвующую в коммуникации.PD: Actual GameFragment9 code: https://gist.github.com/Miguengineer/76df4ae7c17eb6bbf9c0328a5b5ca4b1 Actual ImageGallery: https://gist.github.com/Miguengineer/10e42985792b253fbf583559392cbc93

Ответы [ 2 ]

0 голосов
/ 09 июня 2019

В GameFragment9 вызов startActivityForResult () Например:

val requestCode = 1001
val imageIntent = Intent(requireActivity(), ImageGallery::class.java)
startActivityForResult(imageIntent, requestCode)

также в GameFragment9, обработать результат:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    // Check which request we're responding to
    if (requestCode == 1001) {
        // Make sure the request was successful
        if (resultCode == Activity.RESULT_OK) {
            // The user picked an image. Inspect data Intent.
            val selectedImageId = data.getIntExtra("image_id", -1)
        }
    }
}

В ImageGallery, как только пользователь выбрал изображение:

setResult(Activity.RESULT_OK, Intent().apply {
   putExtra("image_id", 1)
})
finish()
0 голосов
/ 09 июня 2019

Я разобрался с обходом. Это может быть не эффективным решением (потому что кажется, что я начинаю намерение несколько раз), ни умным, но по крайней мере оно работает.

Из ImageGallery (там, где находятся изображения) я запускаю действие, содержащее фрагмент, отправляющий данные:

 @Override
    public void onClick(View v) {
        Intent intent = new Intent(ImageGallery.this, GameActivity9.class);
        intent.putExtra("message", "This message is a test");
        startActivity(intent);
    }
};

Так как он начинает новую активность, оттуда я отправлю данные во фрагмент:

// Get data back
    Intent intent = getIntent();
    String message = intent.getStringExtra("message");
    Bundle data = new Bundle();
    data.putString("key", message);

Наконец, во фрагменте я получаю свои данные:

  @Override
    public void onResume() {
        super.onResume();
        Bundle bundle = this.getArguments();
        if (bundle != null){
            test = bundle.getString("key");
        }

        Toast.makeText(getActivity(), test, Toast.LENGTH_SHORT).show();
    }

Это работает! Однако, как я уже сказал, это просто обходной путь, поэтому я буду ждать лучшего ответа или комментариев, чтобы улучшить мой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...