부모 활동으로 올바르게 돌아가려면 어떻게 해야 합니까?
저는 안드로이드 애플리케이션에 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
'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 |