복잡한 UP 버튼 설치

13649 단어 Android

BACK 및 UP의 차이점


배경 키는 다른 응용 프로그램을 포함하여 이전 화면으로 돌아가고 UP 단추는 같은 응용 프로그램의 상단으로 돌아갑니다.
배경키와 UP키의 차이를 알았지만 한번 해보면 귀찮아진다.

예: EC 응용 프로그램


예를 들어 우리는 다음과 같은 변화된 EC 응용을 고려했다.

제품 상세 화면에는 4개의 도선이 있다.
  • 1. 타임라인에서 바로 올라오기
  • 2. 타임라인에서 검색
  • 3. 제품 상세 정보에서 추가 제품 상세 정보
  • 로 이동
  • 4. Google 검색 결과와 같은 다른 애플리케이션에서 심도 있는 링크
  • 이 제품 상세 화면의 UP 버튼은 어떻게 해야 하나요?각자의 도선에 관해서는 아래와 같아야 한다.
  • 1의 경우
  • 반환 타임라인
  • 이전에 표시된 타임라인의 상태(스크롤 위치 등) 유지
  • 2의 경우
  • 검색 화면 반환
  • 이전에 표시된 검색 화면의 상태(스크롤 위치 등) 유지
  • 3의 경우
  • 첫 번째 상세 화면이 타임라인에서 나오면 타임라인으로, 검색에서 나오면 검색
  • 이전에 표시된 타임라인이나 검색 화면의 상태(스크롤 위치 등) 유지
  • 4의 경우
  • 반환 타임라인
  • 백엔드 스택에 없으므로 새로 생성된 화면
  • 이루어 보세요.


    finish라고만 해요.


    주로 UP와 백스톱 버튼이 같은 행동을 한다.컨덕터가 1 또는 2개인 경우에만 원활하게 진행될 수 있습니다.나는 대부분의 응용 프로그램과 화면이 이렇게 순조롭게 진행될 수 있다고 생각한다.하지만 3, 4가 있으면 안 된다.
    3의 도선의 경우 스택에 여러 개의 제품 상세 화면이 쌓여 있기 때문에 설치할 경우 이전 제품 상세 화면으로 돌아가기만 하면 상부로 돌아갈 수 없다.
    4개의 도선이라면 앞의 프로그램으로 돌아가 같은 프로그램의 상단에 들어갈 수 없다.
    경로
    결실
    메모
    1

    2

    3

    상세 화면으로 돌아가기
    4

    이전 프로그램으로 돌아가기

    NG: 상위 Activity에 생성된 Intent


    그렇군요. 그럼 직접 부모님의 액티비티를 지목해 인터내셔널을 발매하는 건 어떨까요?
    AndroidManifest.부모Activity를 xml로 지정합니다.
    AndroidManifest.xml
    <activity
        android:name=".ProductActivity"
        android:label="Product"
        android:parentActivityName=".TimelineActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".TimelineActivity" />
    </activity>
    
    NavUtils.getParentActivityIntent 상위 Activity에 대한 Intent를 생성합니다.
    ProductActivity.java
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                Intent upIntent = NavUtils.getParentActivityIntent(this);
                NavUtils.navigateUpTo(this, upIntent);
                return true;
        }
        return false;
    }
    
    그러나 이렇게 되면 귀환 목적지는 항상 타임라인에 고정돼 2의 상황에 기대하지 않는 행동으로 바뀐다.그리고 목적지를 옮기는 시간선이 재생성되어 사용자가 보기에 불협화감이 강하다.
    경로
    결실
    메모
    1

    화면 재생성
    2

    타임라인으로 돌아가기
    3

    화면 재생성
    4

    NG: 상위 Activity에 Intent+SINGLE 생성TOP


    목적지로 돌아가지 않으려면 Intent로 SINGLE 보내기탑의 로고를 추가하면 됩니다.이렇게 하면 목적지가 있는 화면으로 되돌아오는 상황에서 다시 생성되지 않는다.창고에 화면이 없으면 다시 생성합니다.
    ProductActivity.java
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                Intent upIntent = NavUtils.getParentActivityIntent(this);
                // CLEAR_TOPはnavigateUpToが勝手につけるが念のため
                upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                NavUtils.navigateUpTo(this, upIntent);
                return true;
        }
        return false;
    }
    
    아니면Activity의launchMode는singleTop일 수 있습니다.
    AndroidManifest.xml
    <activity
        android:name=".TimelineActivity"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    경로
    결실
    메모
    1

    2

    타임라인으로 돌아가기
    3

    4

    OK: 목적지Activity로 되돌아가는 Intent+SINGLE 만들기TOP


    마지막으로 두 가지 모델을 해결해 보자.AndroidManifest.xml에 적힌 부모 액티비티를 사용하면 반드시 타임라인으로 돌아가기 때문에 NavUtils.getParentActivityIntent Intent를 만들지 않아도 된다.
    화면을 자세히 볼 때 목적지로 되돌아갈 것을 지정합니다.
    ProductActivity.java
    public static void startActivity(Activity activity, int parent) {
        Intent intent = new Intent(activity, ProductActivity.class);
        intent.putExtra("parent", parent);
        activity.startActivity(intent);
    }
    
    // 呼び出し方
    // startActivity(SearchActivity.this, ProductActivity.PARENT_SEARCH);
    
    ProductActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_product);
    
        // 親アクティビティの取得。デフォルトはタイムライン画面。
        this.parent = getIntent().getIntExtra("parent", PARENT_TIMELINE);
    
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                Intent upIntent;
                if (this.parent = PARENT_SEARCH) {
                    upIntent = new Intent(this, SearchActivity.class);
                } else {
                    upIntent = new Intent(this, TimelineActivity.class);
                }
                upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                NavUtils.navigateUpTo(this, upIntent);
                return true;
        }
        return false;
    }
    
    그러면 원래의 Activity로 돌아갈 수 있습니다.
    경로
    결실
    메모
    1

    2

    3

    4

    결론

  • 여러 UP가 있는 경우 목적지로 돌아갈 때 사용하지 않습니다NavUtils.getParentActivityIntent.직접 Intent를 만듭니다.
  • 목적지로 되돌아가는 것을 생성하지 않으려면 Intent에 SINGLE을 보냅니다.TOP 로고 추가

  • developer.android.com
    If your activity provides any intent filters that allow other apps to start the activity, you should implement the onOptionsItemSelected() callback such that if the user presses the Up button after entering your activity from another app's task, your app starts a new task with the appropriate back stack before navigating up.
    You can do so by first calling shouldUpRecreateTask() to check whether the current activity instance exists in a different app's task. If it returns true, then build a new task with TaskStackBuilder. Otherwise, you can use the navigateUpFromSameTask() method as shown above.
    그러나 구글 검색 결과의 심층 링크와 스텔스 텐트shouldUpRecreateTask()는 진짜가 되지 않았다.임무를 재생성해야 하는 상황이 언제인지 잘 모르겠다.확실한 텐트에서 시동이 걸렸을 때인가...

    좋은 웹페이지 즐겨찾기