Как я могу изменить Image ImageButton из другого действия с другим фрагментом

У меня есть Fragment (CreaStanzaFragment) с ImageButton. У этого ImageButton есть фотография. Теперь, когда я нажимаю на эту кнопку изображения, он открывает новый класс (галерея, действие с большим количеством изображений). Когда я нажимаю на одно из этих изображений, мне нужно, чтобы ImageButton (во фрагменте) изменилось и открыл этот фрагмент с этим новым изображением в imagebutton.

CreaStanzaFragment принадлежит навигационному рисунку. Это код фрагмента:

public class CreaStanzaFragment extends Fragment {
public CreaStanzaFragment(){}
ImageButton icon;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.activity_log_creastanza, container, false);

    return rootView;
}

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    icon = (ImageButton) view.findViewById(R.id.newicon);
    icon.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            startActivity(new Intent(getContext(), Galleria.class));
        }
    });
}

здесь я размещаю только важные части Galleria

public class Galleria extends Activity {
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gallery_main); //where all the images are located
   recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

   // ......

    recyclerView.addOnItemTouchListener(new GalleryAdapter.RecyclerTouchListener(getApplicationContext(), recyclerView, new GalleryAdapter.ClickListener() {
        @Override
        public void onClick(View view, int position) {
            Bundle bundle = new Bundle();
            bundle.putSerializable("images", images);
            bundle.putInt("position", position);


             Image image = images.get(position);
            String ilnome = inomi.get(position);
            Log.i("ILNOME", ilnome);

      // What i need to do here to change pictures of ImageButton? How can i open Fragment?

            ImageButton icon = (ImageButton) findViewById(R.id.newicon); //loceted in Fragment (CreaStanzaFragment)
            imageButton.setBackgroundResource(0);
            Glide.with(getApplicationContext()).load(image.getMedium())
                    .thumbnail(0.5f)
                    .crossFade()
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(imageButton);
            fragmentTransaction.commit();

        }

С этим кодом:

    setContentView(R.layout.activity_log_creastanza);
            ImageButton imageButton = (ImageButton) findViewById(R.id.newicon);
            imageButton.setBackgroundResource(0);
            Glide.with(getApplicationContext()).load(image.getMedium())
                    .thumbnail(0.5f)
                    .crossFade()
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(imageButton);

Когда я открываю CreaStanzaFragment:

введите здесь описание изображения

Когда я нажимаю на синюю картинку (открывает действие Galleria)

введите здесь описание изображения

Когда я нажимаю на 1 из изображений:

введите здесь описание изображения

ПОЧЕМУ?


person francesco bocci    schedule 21.09.2016    source источник
comment
Если вы используете setContentView в своей деятельности в галерее, она, скорее всего, заменит представление активности в галерее содержимым вашего фрагмента. Также ImageButton icon = (ImageButton) findViewById(R.id.newicon) будет искать не в иерархии просмотра фрагментов, а в Galleria.this.view. Таким образом, в Galleria вам просто нужна ссылка на текущий CreaStanzaFragment или ImageButton, чтобы Galleria мог получить доступ к своему представлению и изменить фон кнопки.   -  person makadev    schedule 21.09.2016
comment
Но, как я могу это сделать? Можете ли вы показать мне пример?   -  person francesco bocci    schedule 21.09.2016
comment
Я постараюсь написать пример в качестве ответа   -  person makadev    schedule 21.09.2016


Ответы (1)


Основная проблема заключается в том, что вам нужно получить доступ к вашему фрагменту из экземпляра Galleria. Для этого вы можете временно «передать» текущий Фрагмент в Галерею.

Класс Galleria, содержащий ссылку на текущий CreaStanzaFragment:

public class Galleria extends Activity {
  private static CreaStanzaFragment currentCreaStanzaFragment = null;
  public static void setFragment(CreaStanzaFragment f) {currentCreaStanzaFragment = f;}
  public static CreaStanzaFragment getFragment() {return currentCreaStanzaFragment;}
...

В CreaStamzaFragment вы устанавливаете ссылку на фрагмент перед вызовом Intent Action:

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    icon = (ImageButton) view.findViewById(R.id.newicon);
    icon.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // pass Fragment Reference
            Galleria.setFragment(CreaStamzaFragment .this)
            startActivity(new Intent(getContext(), Galleria.class));
        }
    });
}

В Galleria on Adapter Action получите доступ к фрагменту и измените imageButton (подразумевается, что фрагмент все еще активен в фоновом режиме и не перезагружается):

recyclerView.addOnItemTouchListener(new GalleryAdapter.RecyclerTouchListener(getApplicationContext(), recyclerView, new GalleryAdapter.ClickListener() {
    @Override
    public void onClick(View view, int position) {
        Bundle bundle = new Bundle();
        bundle.putSerializable("images", images);
        bundle.putInt("position", position);


        Image image = images.get(position);
        String ilnome = inomi.get(position);
        Log.i("ILNOME", ilnome);

        // get imagebutton on fragment
        CreaStamzaFragment f = Galleria.getFragment()
        ImageButton icon = (ImageButton) f. getView().findViewById(R.id.newicon); //loceted in Fragment (CreaStanzaFragment)
        // load as icon
        icon.setBackgroundResource(0);
        Glide.with(getApplicationContext()).load(image.getMedium())
                .thumbnail(0.5f)
                .crossFade()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(icon);
        // explicit release reference
        Galleria.setFragment(null);
        // close galliera activity
        Galleria.this.finish();

    }
...

Примечание. Имейте в виду, что это создает связь между фрагментом и галереей. Более понятным, но, возможно, более сложным процессом будет, например, использование уведомления (шаблона наблюдателя) из галереи «Уведомитель» во фрагмент «слушателя». что изображение было выбрано, и фрагмент должен вместо этого загрузить изображение в обработчик уведомлений.

Тем не менее, это быстро реализовать и достаточно, если Galleria/CreaStanzaFragment не нужно повторно использовать.

person makadev    schedule 21.09.2016
comment
Эта работа! Я не эксперт в Android, тогда я использую ваш код: D tnks для ответа - person francesco bocci; 21.09.2016
comment
Нет проблем, рад, что это помогло. - person makadev; 21.09.2016