0

Hello I'm trying to select an Image in an activity page and that selected image to update in my Fragment page. I've tried what I've learnt previously, but it's not working at all. Below is what I've attempted. I'm still new to android development, so please bear with me.

ProfileSettingsActivity.java:

public class ProfileSettingsActivity extends AppCompatActivity {

ImageView profileImage1;
ImageView profileImage2;
ImageView profileImage3;
ImageView profileImage4;
ImageView profileImage5;
ImageView profileImage6;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile_settings);

    profileImage1 = (ImageView) findViewById(R.id.teamid00);
    profileImage2 = (ImageView) findViewById(R.id.teamid01);
    profileImage3 = (ImageView) findViewById(R.id.teamid02);
    profileImage4 = (ImageView) findViewById(R.id.teamid03);
    profileImage5 = (ImageView) findViewById(R.id.teamid04);
    profileImage6 = (ImageView) findViewById(R.id.teamid05);

    profileImage1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setProfilePicture(view);
        }
    });

    profileImage2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setProfilePicture(view);
        }
    });

    profileImage3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setProfilePicture(view);
        }
    });

    profileImage4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setProfilePicture(view);
        }
    });

    profileImage5.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setProfilePicture(view);
        }
    });

    profileImage6.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setProfilePicture(view);
        }
    });
}

public void setProfilePicture(View view) {
    //Creating a Return intent to pass to the Main Activity
    Intent returnIntent = new Intent();
    //Figuring out which image was clicked
    ImageView selectedImage = (ImageView) view;
    //Adding stuff to the return intent
    returnIntent.putExtra("imageID", selectedImage.getId());
    setResult(RESULT_OK, returnIntent);
    //Finishing Activity and return to main screen!
    finish();
  }
}

Below is the Fragment that contains the page I start on from and go to the ProfileSettingsActivity page

PeopleFragment.java:

public class PeopleFragment extends Fragment {

  ImageButton settingsButton;
  PieChart pieChart;
  ImageButton profileImage;
  private FirebaseAuth mAuth;
  TextView fullName;

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_people2, container, 
false);

    profileImage = (ImageButton) view.findViewById(R.id.imageButton4);
    profileImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent settingsClick = new Intent(getActivity(), 
            ProfileSettingsActivity.class);
            getActivity().startActivityForResult(settingsClick,0);
        }
    });

    fullName = (TextView) view.findViewById(R.id.userProfileFullName);
    mAuth = FirebaseAuth.getInstance();

    return view;
  }


  @Override
  public void onStart() {
    super.onStart();
    // Check if user is signed in (non-null) and update UI accordingly.
    FirebaseUser currentUser = mAuth.getCurrentUser();
    updateUI(currentUser);
  }

  /**
   * Updates the view according to the authentication status.
   * @param user the current FirebaseUser
   */
  private void updateUI(FirebaseUser user) {
    if (user != null) {
        fullName.setText(user.getDisplayName());
    }
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_CANCELED) return;
    //Getting the Avatar Image we show to our users
    ImageView avatarImage = 
    (ImageView)getView().findViewById(R.id.imageButton4);
    //Figuring out the correct image
    String drawableName = "profile1";
    switch (data.getIntExtra("imageID",R.id.teamid00)) {
        case R.id.teamid00:
            drawableName = "profile1";
            break;
        case R.id.teamid01:
            drawableName = "profile2";
            break;
        case R.id.teamid02:
            drawableName = "profile3";
            break;
        case R.id.teamid03:
            drawableName = "profile4";
            break;
        case R.id.teamid04:
            drawableName = "profile5";
            break;
        case R.id.teamid05:
            drawableName = "profile6";
            break;
        default:
            drawableName = "profile1";
            break;
    }
    int resID = getResources().getIdentifier(drawableName, "drawable", 
    getActivity().getPackageName());
    avatarImage.setImageResource(resID);
  }
}

Currently with what I have above, I can move from the fragment page to the activity page and I can press on the buttons to select the images and then the activity closes for me. But when I'm back on the fragment page, the profile image isn't updated at all, and displays the default one.

ישו אוהב אותך
  • 28,609
  • 11
  • 78
  • 96

2 Answers2

0

Probably you've got some problems with your onActivityResult method. Check these answers.

Also there is a solution that is going to work:

1. Tag your fragments when you create them:

FragmentTransaction fTrans = getFragmentManager().beginTransaction();
fTrans.add(R.id.main_layout, new PeopleFragment(), "PeopleFragmentTag"));
fTrans.commit();

2. Write method in PeopleFragment, which could setImage:

public void updateProfileImage(int profileImgID){
    /* Update your image here */
}

3. Get a fragment by tag and call the method:

public void setProfilePicture(View view) {
    /* Your code */

    PeopleFragment peopleFragment = (PeopleFragment) getFragmentManager().findFragmentByTag("PeopleFragmentTag");
    peopleFragment.updateProfileImage(selectedImage.getId());
}

Hope, I helped you somehow. Good luck!

Senior Kot
  • 36
  • 7
0

Try to use startActivityForResult() instead of getActivity().startActivityForResult(). So, change your Fragment code to:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
   ...
   profileImage.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        Intent settingsClick = new Intent(getActivity(), 
        ProfileSettingsActivity.class);
        startActivityForResult(settingsClick,0);
      }
   });

   ...

   return view;
}

Note: This is not related to your problem.

You can simplify you activity code to this:

public class ProfileSettingsActivity extends AppCompatActivity {

ImageView profileImage1;
ImageView profileImage2;
ImageView profileImage3;
ImageView profileImage4;
ImageView profileImage5;
ImageView profileImage6;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile_settings);

    profileImage1 = (ImageView) findViewById(R.id.teamid00);
    profileImage2 = (ImageView) findViewById(R.id.teamid01);
    profileImage3 = (ImageView) findViewById(R.id.teamid02);
    profileImage4 = (ImageView) findViewById(R.id.teamid03);
    profileImage5 = (ImageView) findViewById(R.id.teamid04);
    profileImage6 = (ImageView) findViewById(R.id.teamid05);

    View.OnClickListener clickListener =  new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setProfilePicture(view);
        }
    };

    profileImage1.setOnClickListener(clickListener);
    profileImage2.setOnClickListener(clickListener);
    profileImage3.setOnClickListener(clickListener);
    profileImage4.setOnClickListener(clickListener);
    profileImage5.setOnClickListener(clickListener);
    profileImage6.setOnClickListener(clickListener);
}

public void setProfilePicture(View view) {
    //Creating a Return intent to pass to the Main Activity
    Intent returnIntent = new Intent();
    //Figuring out which image was clicked
    ImageView selectedImage = (ImageView) view;
    //Adding stuff to the return intent
    returnIntent.putExtra("imageID", selectedImage.getId());
    setResult(RESULT_OK, returnIntent);
    //Finishing Activity and return to main screen!
    finish();
  }
}
ישו אוהב אותך
  • 28,609
  • 11
  • 78
  • 96