Android中两种不同活动打开时的不同活动行为

时间:2017-04-27 22:06:22

标签: java android android-intent android-activity

在我问这个问题之前,我真的在StackOwerflow上看了几天不同的答案,但我找不到答案。

这就是我正在做的事情 - 我有一个UserProfileActivity的应用,我希望能够从myContactsListActivitymessageActivity开展两项不同的活动。我希望在UserProfileActivity中发送的数据包含userIduserNameprofilePhootoaboutUser。 在第一种情况下,我希望通过myContactsListActivity的意图传递此数据,而在第二种情况下,我希望仅从userId传递myContactsListActivity并调用从服务器获取数据。

这就是我现在这样做的方式。当它从myContactsListActivity打开时,我使用意图将数据传递到UserProfileActivity,并仅从userId传递messageActivity,并使用if else来确定调用的意图

简而言之:活动A可以从活动B和C打开。我需要两种不同的行为。如果从表单B打开,则所有内容都通过intent传递,如果从C打开,则只传递userId并且调用服务器。我如何确定打开哪个活动,以及设置不同行为的最佳方式

这是我的代码, IT WORKS ,但我对它不满意,我正在寻找更好的解决方案:

TextView textViewUserName, textViewAbout;
ImageView imageView;
Toolbar toolbar;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contact_profile);

    Intent intent = getIntent();
    final String userId = intent.getStringExtra("userId");
    String userName = intent.getStringExtra("userName");
    String about = intent.getStringExtra("about");
    String image = intent.getStringExtra("image");

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    if (toolbar != null) {
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    textViewUserName = (TextView) findViewById(R.id.contactUsername);
    textViewAbout = (TextView) findViewById(R.id.aboutMe);

    ColorGenerator generator = ColorGenerator.MATERIAL; 
    final int color = generator.getColor(userId);
    TextDrawable.IBuilder builder = TextDrawable.builder()
            .beginConfig()
            .withBorder(1)
            .endConfig()
            .rect();

    if (userName != null) {

        String firstLetter = intent.getStringExtra("userName").substring(0, 1);

        TextDrawable textDrawable = TextDrawable.builder().buildRect(firstLetter, color);
        imageView = (ImageView) findViewById(R.id.profile_image);
        imageView.setImageDrawable(textDrawable);
        Picasso.with(this)
                .load("http://192.168.0.13/mynewapp/profilephotos/" + image)
                .placeholder(textDrawable)
                .error(textDrawable)
                .centerCrop()
                .fit()
                .into(imageView);
        getSupportActionBar().setTitle(userName);

        Intent commentDescriptionIntent = new Intent(this, AboutFragment.class);
        commentDescriptionIntent.putExtra("userId", userId);
        commentDescriptionIntent.putExtra("userName", userName);
        commentDescriptionIntent.putExtra("about", about);
        setIntent(commentDescriptionIntent);

    } else {
        ApiInterface apiService =
                ApiClient.getClient().create(ApiInterface.class);

        Call<ContactResponse> call = apiService.userExists(userId);
        call.enqueue(new Callback<ContactResponse>() {
            @Override
            public void onResponse(Call<ContactResponse> call, retrofit2.Response<ContactResponse> response) {
                Contact contact = response.body().getResults();

                String firstLetter = contact.getUserName().substring(0, 1);
                TextDrawable textDrawable = TextDrawable.builder().buildRect(firstLetter, color);
                imageView = (ImageView) findViewById(R.id.profile_image);
                imageView.setImageDrawable(textDrawable);
                Picasso.with(getApplicationContext())
                        .load("http://localhost/mynewapp/profilephotos/" + contact.getThumbnailUrl())
                        .placeholder(textDrawable)
                        .error(textDrawable)
                        .centerCrop()
                        .fit()
                        .into(imageView);

                CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
                String userName = contact.getUserName();
                collapsingToolbarLayout.setTitle(userName);
            }

            @Override
            public void onFailure(Call<ContactResponse> call, Throwable t) {
                // Log error here since request failed
                Log.e(TAG, t.toString());
            }
        });
    }

2 个答案:

答案 0 :(得分:3)

尝试在extra上使用另一个Intent值。

例如:

来自ActivityB

    Intent intent = new Intent(ActivityB.this, ActivityA.class);
    intent.putExtra("FROM_ACTIVITY", "B");
    // Others extra values
    startActivity(intent);

来自ActivityC

    Intent intent = new Intent(ActivityC.this, ActivityA.class);
    intent.putExtra("FROM_ACTIVITY", "C");
    // Others extra values
    startActivity(intent);

ActivityA

中执行此操作
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contact_profile);


    String fromActivity = getIntent().getStringExtra("FROM_ACTIVITY");

    if(fromActivity.equals("B")) {
        // Do something
    } else if(fromActivity.equals("C")) {
        // Do something
    }
}

希望这会有所帮助〜

答案 1 :(得分:2)

这是我继续这样做的方式,我们可以使用片段加载活动,具体取决于活动的不同状态,

所以你可以拥有2个不同的片段。可能会加载相同的UI / xml视图,但行为不同,只需设置来自intent的值。和其他从外部api加载的东西。

注意:

尝试使用加载程序从外部api加载内容。它有自己的回调,可以在收到数据后用来加载数据。

这是一个更高层次的想法,如果您有任何其他问题,请告诉我