如何在活动中选择图像时更新片段中的图像?

时间:2017-11-30 21:36:05

标签: java android

您好我试图在活动页面中选择一个图像,并在我的片段页面中选择要更新的图像。我已经尝试过我之前学过的东西,但它根本没有工作。以下是我的尝试。我还是Android开发的新手,所以请耐心等待。

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();
  }
}

下面是包含我开始的页面并转到ProfileSettingsActivity页面的片段

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);
  }
}

目前,我已经从片段页面移动到活动页面,我可以按下按钮选择图像,然后活动关闭。但是当我回到片段页面时,配置文件图像根本没有更新,并显示默认值。

2 个答案:

答案 0 :(得分:0)

您的 onActivityResult 方法可能存在一些问题。检查these answers

还有一个解决方案可行:

<强> 1。在创建片段时标记片段:

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

<强> 2。在PeopleFragment中编写方法,可以设置图像:

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

第3。按标记获取片段并调用方法:

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

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

希望,我以某种方式帮助了你。祝你好运!

答案 1 :(得分:0)

尝试使用getActivity().startActivityForResult()代替@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; } 。因此,将Fragment代码更改为:

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();
  }
}

注意:这与您的问题无关。

您可以将活动代码简化为:

findViewById