부모 활동으로 올바르게 돌아가려면 어떻게 해야 합니까?
저는 안드로이드 애플리케이션에 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" />
또는 사용.parentActivityName
15 이상이면
부모 활동명이 나쁜 안드로이드 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
'it-source' 카테고리의 다른 글
Javascript/jQuery : 다중 선택에서 값 설정(Selection) (0) | 2023.10.28 |
---|---|
왼쪽에서 여는 각도 부트스트랩 드롭다운 (0) | 2023.10.28 |
make 명령의 m 옵션, makefile (0) | 2023.10.23 |
왼쪽 자체 가입은 '기본'당 하나의 행을 반환합니다. (0) | 2023.10.23 |
두 날짜 사이의 시간 차이(시간 단위)를 구하는 방법 (0) | 2023.10.23 |