툴바 위에 ActionMode 표시


87

나는 전통적인 것 외에도 android.view.ActionMode새로운 것과 함께 사용하려고합니다 . 다음과 같이 표시 할 수 있습니다.android.support.v7.widget.Toolbarandroid.app.ActionBar

toolbar.startActionMode(callback);

문제 ActionMode는가 위에 표시 ActionBar되지 않고 위에 표시 된다는 것 입니다 Toolbar. 그것을 바꿀 수있는 방법이 있습니까?

내 테마에서 다음을 설정하려고 시도했지만 아무것도 변경되지 않는 것 같습니다.

<item name="windowActionModeOverlay">true</item>

1
나는 ActionMode가 액션 바의 일부라고 생각하고 당신의 위치는 변경할 수 없습니다
SpyZip

유감 이네요. 대답을 주셔서 감사합니다
에 탕

1
툴바를 액션 바로 설정 했습니까?
Nikola Despotoski 2014

1
여전히 동일한 문제가 있습니다. 이에 대한 업데이트가 있습니까? 아래에 표시된 내용에 대한 헤더 및 옵션 메뉴와 동일한 상황, 클래식 액션 바와 하나의 도구 모음, 아래에 하나의 도구 모음이 있습니다. 이 문제에 직면하여 액션 모드를 아래로 이동할 수 없습니다.
cV2

답변:


82

당신은을 사용하고 있기 때문에 Toolbar, 나는 또한 당신이를 사용한다고 가정 AppCompatActivity하고, 내장 교체 한 ActionBar사용자 정의와 함께 Toolbar사용 setSupportActionBar(toolbar);

먼저 올바른 네임 스페이스를 가져오고 있는지 확인하십시오.

import androidx.appcompat.view.ActionMode;
// Or
import android.support.v7.view.ActionMode;

그리고 아닙니다

import android.view.ActionMode;

그런 다음 사용

_actionMode = startSupportActionMode(this);

그리고 아닙니다

_actionMode = startActionMode(this);

35
이것과 windowActionModeOverlay설정 이 저에게 효과적이었습니다.
Jimeux 2015-06-05

4
나는 현재 사용 AppCompatActivity하고 있으며 추가 windowActionModeOverlay 로 충분했습니다. 가져 오기를 사용하려고했지만에서 android.support.v7.view.ActionMode작동하지 않아 대신 MultiChoiceModeListener사용하게 android.view.ActionMode되었습니다. 의 지원 버전이 있는지 아십니까 MultiChoiceModeListener? 감사합니다
악셀

MultiChoiceModeListener의 지원 버전이 있습니까?
galaxigirl apr

@galaxigirl,있는 것 같지 않습니다. 당신은 당신의 어댑터와보기 holderr에서 클릭 이벤트 처리해야
peterchaula

67

활동에서 시작하지 말고 도구 모음에서 시작하십시오. 당신의 활동에서 :

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)

그리고 당신은 사용해야합니다

<item name="windowActionModeOverlay">true</item>

Andre가 말한대로 주제에서.


1
저에게도 특별한 요구 사항이 있었기 때문에 이것은 저에게 효과적이었습니다. 구현하는 대신 구현 ActionMode.Callback하고 싶었습니다 MultiChoiceModeListener. 지원 사용의 문제 ActionMode는 .NET Framework의 지원 버전이없는 것 같습니다 MultiChoiceModeListener.
jwir3

43

테마에서 이것을 시도하십시오.

<item name="windowActionModeOverlay">true</item>

내 질문에서 언급했듯이 이미 성공하지 못했습니다. 하지만 감사합니다!
Gaëtan 2014-10-27

죄송합니다. 이미 사용해 본 적이 있는지 몰랐습니다. 작동하지 않는 것이 확실합니까? 그것은 나를 위해 작동합니다.
André Restivo 2014 년

나는 같은 문제가 있었고 이것은 그것을 고쳤다. 감사!
Marta Rodriguez

2
나는 android:접두사를 사용하거나 사용하지 않고 시도하고 내 응용 프로그램 테마에 넣었습니다. 는 ActionMode오버레이 ActionBar,하지만 난 내을 통해 원하는 Toolbar아래 인 ActionBar.
Gaëtan 2014 년

@ Gaëtan 이것에 대한 답을 얻었습니까? 내 앱이 API 21 이상을 지원하기 때문에 동일한 문제가 발생하고 AppCompatActivity가 아닌 Activity를 확장하고 있습니다.
SjDev

15

사람들이 명확하지 않은 한 가지는

<item name="windowActionModeOverlay">true</item>

기본 테마 즉, AppTheme.NoActionBar가 아닌 AppTheme에 배치됩니다.

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionModeOverlay">true</item>
</style>

<style name="transparent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
</style>


<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />


이것이 내가 필요한 유일한 변화였습니다. 감사!
PNDA

5

AndroidManifest.xml을 찾은 다음 애플리케이션 또는 활동 테마에서 아래 코드를 추가하십시오.

<item name="windowActionModeOverlay">true</item>

그처럼:

<style name="WorkTimeListTheme" parent="AppTheme.NoActionBar">
        <item name="windowActionModeOverlay">true</item>
        <item name="actionModeBackground">@color/theme_primary</item>
    </style>

1

이것이 제가 만든 해결책입니다.

내에서 onCreateActionMode의 방법 ActionMode.Callback ,이 추가 :

StandaloneActionMode standaloneActionMode = (StandaloneActionMode) actionMode;
Field mContextView;
try {
     mContextView = StandaloneActionMode.class.getDeclaredField("mContextView");
     mContextView.setAccessible(true);
     View contextView = (View) mContextView.get(standaloneActionMode);
     MarginLayoutParams params = (MarginLayoutParams) contextView.getLayoutParams();
     params.topMargin = mToolbar.getTop();
  } catch (NoSuchFieldException e) {
            e.printStackTrace();
  } catch (IllegalAccessException e) {
            e.printStackTrace();
  } catch (IllegalArgumentException e) {
            e.printStackTrace();
  }

그것은 나를 위해 작동합니다.


1

위의 모든 방법을 시도했지만 여전히 작동하지 않습니다. 그런 다음 아래 방법을 시도했습니다.

    private class ActionModeCallback implements ActionMode.Callback {
    @Override
    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        actionMode.getMenuInflater().inflate(R.menu.note_find_action, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
        ((AppCompatActivity) getActivity()).getSupportActionBar().hide();
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode) {
        ((AppCompatActivity) getActivity()).getSupportActionBar().show();
    }
}

여기서는 지원 라이브러리의 액션 모드와 startSupportActionMode 메소드를 사용했습니다. 동시에 나는 주어진 활동의 주제를 수정하려고 시도했다. 확실히 작동하지 않습니다. 따라서 더 나은 선택이 없다면 이것을 시도해 볼 수 있습니다.

최근에 내 앱의 여러 테마를 활성화하기 위해 Colorful 프레임을 사용했음을 발견했습니다. 그러면 코드의 테마가 변경됩니다. 이 프레임 워크에서 스타일을 수정하려고하면 작동합니다.

작동하기를 바랍니다.


이것은 나를 위해 일한 유일한 것입니다. 감사합니다.
Rachit

0

뷰 트리가 보이면 아래 코드를 작성할 수 있습니다.

 ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
    traverseView(decorView);
 /**
 * traverse find actionmodebar
 * @param root  view
 */
public void traverseView(View root) {
    if (root==null){
        return;
    }
    if (root instanceof ActionBarContextView){
        root.setVisibility(View.GONE);
        return;
    }
    if ((root instanceof ViewGroup)) { // If view is ViewGroup, apply this method on it's child views
        ViewGroup viewGroup = (ViewGroup) root;
        for (int i = 0; i < viewGroup.getChildCount(); ++i) {
            traverseView(viewGroup.getChildAt(i));
        }
    }
}

0

그래서 며칠 후에이 스레드를 거쳐 마침내 작동하게되었습니다. 내가 한 일을 요약하고 싶습니다.

참고 : 이것은 Toolbar에서 기본값을 바꾸는 데 사용하는 솔루션 ActionBar입니다 AppCompatActivity.

  1. 나는이 줄을 내에 추가했습니다 AppTheme: 그것은 당신의 액션 모드가 툴바를 오버레이하기를 원한다고 안드로이드에게 알려줍니다.
<item name="windowActionModeOverlay">true</item>
  1. 올바른 가져 오기 사용 :

다음 작업을 수행하려면 이러한 가져 오기를 사용해야합니다 AppCompatActivity.

import androidx.appcompat.view.ActionMode;
// or
import android.support.v7.view.ActionMode;
  1. 다음과 같이 활동에서 ActionMode를 시작하십시오.
actionMode = startSupportActionMode(callback);

그리고 그렇지 않습니다 :

actionMode = startActionMode(callback);

Activity는 supportActionToolbar로 설정되어 있기 때문에 툴바에 ActionMode를 자동으로 생성합니다. 스타일은 디스플레이를 오버레이로 처리합니다.

@Kuffs와 @Lefty에게 감사드립니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.