it-source

부모 활동으로 올바르게 돌아가려면 어떻게 해야 합니까?

criticalcode 2023. 10. 28. 07:59
반응형

부모 활동으로 올바르게 돌아가려면 어떻게 해야 합니까?

저는 안드로이드 애플리케이션에 2개의 활동(A와 B)이 있으며 활동 A에서 활동 B로 이동하려는 의도를 사용합니다.parent_activity를 사용할 수 있습니다.

 <activity
        android:name=".B"
        android:label="B" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.app_name.A" />
  </activity>

저는 UP 버튼을 제공하는 테마도 사용합니다.

그래서 제가 B 활동을 부른 후에 저는 업 버튼을 사용해서 A 활동으로 돌아갈 수 있습니다.문제는 애플리케이션이 다시 액티비티 A의 onCreate()-function을 호출하는 것 같고 이것은 제가 필요로 하는 동작이 아니라는 것입니다.나는 내가 B 활동을 부르기 전과 똑같이 보이기 위해 A 활동이 필요합니다.

이를 달성할 수 있는 방법이 있습니까?

편집

저는 A 활동에서 B 활동을 시작하기 위한 코드를 작성하지 않았습니다.이클립스에 의해 자동 생성된 것 같습니다.

클래스 B는 다음과 같습니다.

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_b, menu);
    return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

표준과 함께 활동 A를 선언했습니다.launchMode안드로이드 매니페스트에 저장되어 있습니다.문서에 따르면, 이는 다음을 의미합니다.

시스템은 항상 대상 작업에서 작업의 새 인스턴스를 생성하고 해당 작업으로 의도를 라우팅합니다.

따라서 시스템은 강제로 활동 A를 다시 생성합니다(즉, 호출).onCreate 작업 스택이 올바르게 처리된 경우에도 마찬가지입니다.

이 문제를 해결하려면 매니페스트를 변경하고 A 액티비티 선언에 다음 속성을 추가해야 합니다.

android:launchMode="singleTop"

참고: 전화하기finish()(이전에 해결책으로 제안된 바와 같이) 종료하려는 활동 B 인스턴스가 활동 A 인스턴스 위에 있는 것을 완전히 확신만 작동합니다.좀 더 복잡한 워크플로우(예: 알림에서 활동 B 시작)에서는 그렇지 않을 수 있으므로 활동 A를 B에서 올바르게 시작해야 합니다.

업데이트된 답변: Up Navigation Design

어떤 활동이 각 활동에 적합한 부모 활동인지 선언해야 합니다.이렇게 하면 매니페스트 파일에서 논리적 상위 활동을 결정할 수 있기 때문에 시스템이 Up과 같은 탐색 패턴을 용이하게 할 수 있습니다.

따라서 이를 위해서는 부모의 Activity with Attribute 태그에서 Activity를 선언해야 합니다.

android:parentActivityName

맘에 들다,

<!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.app_name.A" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name=".B"
        android:label="B"
        android:parentActivityName="com.example.app_name.A" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.app_name.A" />
    </activity>

이렇게 부모 활동이 선언되면 아래와 같이 적절한 부모까지 탐색할 수 있습니다.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

그래서 니가 전화할때NavUtils.navigateUpFromSameTask(this);이 메서드는 현재 작업을 완료하고 해당 부모 작업을 시작(또는 재개)합니다.대상 상위 활동이 태스크의 백스택에 있는 경우 다음에서 정의한 대로 전달됩니다.FLAG_ACTIVITY_CLEAR_TOP.

그리고 Up 버튼을 표시하려면 선언해야 합니다.setDisplayHomeAsUpEnabled():

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

이전 답변: (상향 네비게이션 미포함, 기본 뒤로 네비게이션)

이는 활동 B에서 활동 A를 다시 시작할 경우에만 발생합니다.

으로.startActivity().

대신 활동 A에서 활동 B를 시작합니다.startActivityForResult()오버라이드(override)onActivtyResult()활동 A에서.

이제 활동 B에서 전화하기만 하면 됩니다.finish()위로 버튼을 누릅니다.그럼 이제 활동 A로 향하셨군요onActivityResult()다시 활동 A를 만들지 않고..

저는 거의 같은 설정을 받고 있었고, 원치 않는 행동을 하게 되었습니다.이것은 나에게 효과가 있었습니다: 의 액티비티 A에 다음 속성을 추가하는 것입니다.Manifest.xml 앱의의:

android:launchMode="singleTask"

자세한 설명은 이 기사를 참조하십시오.

오래된 질문이지만, 위젯에서 활동 B를 심층 링크한 이후로 이전의 모든 답변이 제게 맞지 않았기 때문에 다른 (가장 깨끗하고 좋은) 해결책이 있습니다.

public void navigateUp() {
final Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
    Log.v(logTag, "Recreate back stack");
        TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
  } else {
    NavUtils.navigateUpTo(this, upIntent);
  }
}

[https://stackoverflow.com/a/31350642/570168 ]

참고: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android

이를 달성하기 위한 더 나은 방법은 다음 두 가지를 사용하는 것입니다.

NavUtils.navigateUpFromSameTask(this);

이제 이것이 작동하려면 매니페스트 파일에 활동 A에 부모 활동 B가 있음을 명시해야 합니다.부모 활동에는 아무것도 필요 없습니다.버전 4 이상에서는 추가적인 노력 없이 멋진 뒤로 화살표를 얻을 수 있습니다. (이것은 하위 버전에서도 약간의 코드로 할 수 있습니다. 아래에 넣겠습니다.) GUI의 manifest-> application 탭에서 이 데이터를 설정할 수 있습니다(부모 활동 이름으로 스크롤하여 손으로 입력).

지원 노드:

버전 4 이하 버전을 지원하려면 메타데이터도 포함해야 합니다.활동 우클릭, add-> meta 데이터, name = android지지하다.PARENT_ACTIVE 및 값 = your.full.activity.name

하위 버전에서도 멋진 화살표를 얻을 수 있습니다.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

이 모든 것을 작동시키기 위해서는 지원 라이브러리 버전 7이 필요하겠지만, 그럴만한 가치가 있습니다!

저에게 도움이 된 것은 다음과 같습니다.

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onBackPressed() {
        finish();
    }

.TheRelevantActivity.java그리고 지금은 예상대로 작동하고 있습니다.

그리고 네, 잊지 마시고 덧붙이세요.

getSupportActionbar.setDisplayHomeAsUpEnabled(true);인에onCreate()방법

나는 노력했다.android:launchMode="singleTask"안 됐어요하지만 소용이 없어.나를 위해 일했습니다.android:launchMode="singleInstance"

@LorenCK의 답변에 변화를 더합니다.

NavUtils.navigateUpFromSameTask(this);

만약 당신의 활동이 다른 활동으로부터 시작될 수 있고 이것이 어떤 다른 앱에 의해 시작된 작업의 일부가 될 수 있다면 아래 코드로

Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
    TaskStackBuilder.create(this)
            .addNextIntentWithParentStack(upIntent)
            .startActivities();
} else {
    NavUtils.navigateUpTo(this, upIntent);
}

그러면 새 작업이 시작되고 Min SDK 버전 <= 15>의 아래와 같이 Manifest에서 정의할 수 있는 Activity의 상위 Activity가 시작됩니다.

<meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.app_name.A" />

또는 사용.parentActivityName15 이상이면

부모 활동명이 나쁜 안드로이드 5.0을 사용할 때도 비슷한 문제가 있었습니다.

<activity
        android:name=".DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName=".MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>

부모 활동명에서 com.example.mirfirst app을 제거했는데 제대로 작동했습니다.

Java 클래스에서 :-

    toolbar = (Toolbar) findViewById(R.id.apptool_bar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setTitle("Snapdeal");

    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

매니페스트에서 :-

<activity
            android:name=".SubActivity"
            android:label="@string/title_activity_sub"
            android:theme="@style/AppTheme" >
            <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"></meta-data>
    </activity>

도움이 될 것입니다.

속성을 사용하여 활동 매니페스트 정보에 추가

android:launchMode="singleTask"

저한테 잘 먹혀요.

    @Override
public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
    case android.R.id.home:
        finish();
        return true;
}
return super.onOptionsItemSelected(item);

백 프레스처럼

시도해 보십시오.

Intent intent;
@Override
public void onCreate(Bundle savedInstanceState) {
    intent = getIntent();   
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_b, menu);
    return true;
}  

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpTo(this,intent);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

내 매니페스트에 들어가서 추가하기android:launchMode="singleTop"그 활동이 나에게 효과가 있었습니다.

이를 통해 안드로이드가 이전 작업의 새 인스턴스를 만들지 않기를 원했기 때문에 특별히 문제가 해결되었습니다.Up도구 모음의 단추 - 대신 탐색 계층을 올라갈 때 이전 작업의 기존 인스턴스를 사용하려고 했습니다.

참조: 안드로이드: 런치모드

이 솔루션을 사용하려면 하위 작업: https://stackoverflow.com/a/49980835/7308789 에서 NavUtils.navigateUpFromSameTask(이것)를 사용하십시오.

어떤 맥락에서든 부모 활동을 열고 싶다면onBackPressed

protected fun navigateToParent() {
        NavUtils.getParentActivityIntent(this)?.let { upIntent ->
            if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot) {
                Timber.d("navigateToParent: sourceActivity should recreate")
                startActivity(upIntent)
            } else {
                Timber.d("navigateToParent: sourceActivity in stack, just finish")
            }
        }
        super.onBackPressed()
    }

세트android:parentActivityName명백하게

 <activity
            android:name=".feature.signup.SignUpActivity"
            android:parentActivityName=".feature.welcome.WelcomeActivity"
            android:windowSoftInputMode="adjustResize" />

언급URL : https://stackoverflow.com/questions/12276027/how-can-i-return-to-a-parent-activity-correctly

반응형