Programing

부모 활동을 동적으로 설정

lottogame 2020. 12. 12. 09:58
반응형

부모 활동을 동적으로 설정


따라서 현재 두 가지 다른 활동에서 도달 할 수있는 활동이 있는데 문제는 매니페스트 XML 파일에서 하나의 활동 만 부모 활동으로 설정할 수 있다는 것입니다. 분명히 이것은 활동이 이전에 있었던 잘못된 활동으로 사용자를 다시 보낼 수 있기 때문에 잘못된 UX / UI 디자인이므로 어떤 활동이 부모 활동인지 동적으로 설정하려고합니다.

문제는 코드 나 XML에서이 문제를 해결하는 방법을 잘 모르기 때문에 어떤 포인터라도 감사하게 생각한다는 것입니다. :)


여기에는 '위'와 '뒤로'두 가지 개념이 있습니다. '뒤로'는 분명한 것입니다. 여기에 오기 직전에 있었던 곳으로 데려다주세요. 일반적으로 시스템에서 잘 처리하므로 '뒤로'에 대해 걱정할 필요가 없습니다. '위로'는 그다지 분명하지 않습니다. 축소와 유사합니다. 요소에서 컬렉션, 디테일에서 더 넓은 그림까지.

다음 중 사용 사례에 적합한 것은 무엇입니까?


아래 댓글에 따라 : 위쪽 버튼은 Android 매니페스트에서 대상을 가져 오지만 프로그래밍 방식 으로 맞춤 설정할 수 있습니다 .


향후 독자를 위해 개발자 가이드에 따라 공식 / 적절한 솔루션을 실제로 구현하는 방법에 대한 예가 있습니다 ( " 부모 활동이 다를 수있는 경우 적합 합니다 ... "로 시작하는 단락으로 스크롤 ).

이 솔루션은 지원 라이브러리사용하여 구현 ActionBar하고 있으며, 최소한 취소하려는 활동이 '작업'에있는 경우 최소한 매니페스트 XML 파일의 '기본'상위 활동을 대체하도록 설정할 수 있다고 가정 합니다. 앱에 속하지 않습니다 (설명을 위해 링크 된 문서 참조).

// Override BOTH getSupportParentActivityIntent() AND getParentActivityIntent() because
// if your device is running on API 11+ it will call the native
// getParentActivityIntent() method instead of the support version.
// The docs do **NOT** make this part clear and it is important!

@Override
public Intent getSupportParentActivityIntent() {
    return getParentActivityIntentImpl();
}

@Override
public Intent getParentActivityIntent() {
    return getParentActivityIntentImpl();
}

private Intent getParentActivityIntentImpl() {
    Intent i = null;

    // Here you need to do some logic to determine from which Activity you came.
    // example: you could pass a variable through your Intent extras and check that.
    if (parentIsActivityA) {
        i = new Intent(this, ActivityA.class);
        // set any flags or extras that you need.
        // If you are reusing the previous Activity (i.e. bringing it to the top
        // without re-creating a new instance) set these flags:
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        // if you are re-using the parent Activity you may not need to set any extras
        i.putExtra("someExtra", "whateverYouNeed");
    } else {
        i = new Intent(this, ActivityB.class);
        // same comments as above
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        i.putExtra("someExtra", "whateverYouNeed");
    }

    return i;
}

참고 : 매니페스트 XML 파일에 기본 부모 활동을 설정하지 않은 경우 시스템에서 작업에 대한 백 스택을 생성하는 방법을 알지 못하므로 onCreateSupportNavigateUpTaskStack ()도 구현해야합니다 . 이 부분에 대한 예를 제공하지 않았습니다.

finish()타입 솔루션 에 대한 내 생각

이 문제에 대한 해결책을 찾고 있을 onOptionsItemSelected()android.R.id.home버튼 을 무시 하고 가로채는 전략을 옹호하는 몇 가지 답변을 발견하여 단순히 finish()현재 Activity화면으로 돌아갈 수 있도록했습니다.

많은 경우에 이것은 원하는 동작을 얻을 수 있지만, 이것이 적절한 UP 탐색과 확실히 동일 하지 않다는 점을 지적하고 싶습니다 . 상위 활동 중 하나를 통해 하위 활동으로 이동하는 경우 yes finish()는 적절한 이전 화면으로 돌아가지만 알림을 통해 하위 활동을 입력 한 경우 어떻게됩니까? 이 경우 finish()UP 버튼을 누르면 알림을 누르기 전에 보던 앱이나 홈 화면으로 바로 돌아갈 수 있습니다. 대신 앱 내에서 적절한 부모 활동으로 이동해야합니다.


이런 식으로 부모 활동으로 동적으로 이동할 수 있습니다.

getActionBar().setDisplayHomeAsUpEnabled(true);

@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);
}

참고 : 부모인지 여부에 관계없이 출처가 된 활동 또는 조각으로 리디렉션됩니다. 작업 표시 줄 위로 / 홈 버튼을 클릭하면 현재 활동이 완료됩니다.


Up Navigation을 올바르게 사용하는 방법을 알아 보려면 이 Android 개발자 가이드를 참조 하세요.

NavUtils 함수가 ICS (이하) 및 JellyBean (이상)에 대해 다르게 작동하므로 위의 Android 개발자 가이드에 큰 결함이 있습니다. NavUtils의이 결함은 여기 에서 아름답게 설명 됩니다.


재정의 할 메서드는 getParentActivityIntent입니다.

여기 내 코드가 있으며 완벽하게 작동합니다.

@Override
public Intent getParentActivityIntent() {
    Intent parentIntent= getIntent();
    String className = parentIntent.getStringExtra("ParentClassSource"); 

    Intent newIntent=null;
    try {
        //you need to define the class with package name
        newIntent = new Intent(OnMap.this, Class.forName(className));

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return newIntent;
}

부모 활동에서;

Intent i = new Intent(DataDetailsItem.this, OnMap.class);
i.putExtra("ParentClassSource", "com.package.example.YourParentActivity");
startActivity(i);

Generally, a 'detail' type of activity will have to provide the 'up' navigation if it has nested/related contents. The 'back' navigation is handled by the system so you really don't have to worry about it.

Now for the extra effort to support the 'up' navigation, there are a few ways of doing it:

  1. Activity that has the parent activity defined in the AndroidManifest.

    Your Android Manifest
    ---------------------
    
    <activity
        android:name="com.example.app.DetailActivity"
        android:parentActivityName="com.example.app.MainActivity" >
        <meta-data 
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.app.MainActivity" />
    </activity>
    
    Your Detail Activity
    --------------------
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        switch (item.getItemId()) {
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
    

    This works well if there's only one parent activity meaning if the (DetailActivity) always gets launched from (MainActivity). Otherwise this solution will not work if (DetailActivity) gets launched from different places. More here: http://developer.android.com/training/implementing-navigation/ancestral.html

  2. (Easier and Recommended) Activity with Fragment and Fragment back-stack:

    Your Detail Activity
    --------------------
    
    protected void replaceFragment(Bundle fragmentArguments, boolean addToBackStack) {
    
        DetailFragment fragment = new DetailFragment();
        fragment.setArguments(fragmentArguments);
    
        // get your fragment manager, native/support
        FragmentTransaction tr = fragmentManager.beginTransaction();
        tr.replace(containerResId, fragment);
        if (addToBackStack) {
            tr.addToBackStack(null);
        }
        tr.commit();
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
    

    In this solution, if the user presses 'back', the fragment will be popped from the fragment backstack and the user is taken back to the previous fragment while still remaining in the same activity. If the user presses the 'up', the activity dismisses and the user is lead back to the previous activity (being the parent activity). The key here is to use the Fragment as your UI and the activity as the host of the fragment.

Hope this helps.


You will need to keep track of the parent activity. One way to do this is by storing it as an extra in the intent you create to start the child activity). For example, if Activity A starts Activity B, store A's intent in the intent created for B. Then in B's onOptionsItemSelected where you handle the up navigation, retrieve A's intent and start it with the desired intent flags.

The following post has a more complex use-case with a chain of child activites. It explains how you can navigate up to the same or new instance of the parent and finish the intermediate activities while doing so.

Android up navigation for an Activity with multiple parents


You can override the Up button to act like the back button as following:

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

참고URL : https://stackoverflow.com/questions/19184154/dynamically-set-parent-activity

반응형