그래서 방금 코드베이스를 Lollipop으로 업데이트했는데 Action Bar에 문제가 있습니다. AppCompat 및 ActionBarActivity를 사용하고 있으며 사용자 지정보기를 확장하고 있습니다. 사용자 지정보기가 더 이상 화면의 전체 너비를 차지하지 않고 왼쪽에 얇은 띠가 남는 것 같습니다.
예전 모습
지금 모습
이것은 액션 바를 설정하는 데 사용하는 코드입니다. 누구나 아이디어가 있습니까?
final ActionBar actionBar = getSupportActionBar();
if(actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setCustomView(R.layout.action_bar_content_search_custom_view);
actionBar.setBackgroundDrawable(null);
// actionBar.setStackedBackgroundDrawable(null);
TextView title = (TextView) actionBar.getCustomView().findViewById(R.id.action_bar_title);
title.setText(R.string.youtube);
ImageView back = (ImageView) actionBar.getCustomView().findViewById(R.id.action_bar_back);
back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
편집하다
사용자 정의보기를 꺼내고 배경을 변경하면 이제 전체 너비를 차지합니다. 그래서 문제는 CustomView가 ActionBar의 전체 너비를 차지하도록 어떻게 만들 수 있습니까?
답변
ActionBar
최근 appcompat-v7
업데이트 의 에 대한 최신 변경 사항으로 인해 발생한 것 같습니다 . 작업 표시 줄을 처리하는 방법이 크게 변경된 것 같습니다.
나는 같은 문제에 직면했고 ActionBar
문서를 읽은 후 특히 다음 인용문 을 읽고 해결책을 찾았습니다.
Android L (API 레벨 21)부터 작업 표시 줄은 애플리케이션 레이아웃 내의 툴바 위젯으로 표시 될 수 있습니다. 애플리케이션은 툴바를 활동의 작업 표시 줄로 처리해야하는 활동에 신호를 보낼 수 있습니다. 이 기능을 사용하는 활동은 제공된 .NoActionBar 테마 중 하나를 사용하고 windowActionBar 속성을 false로 설정하거나 그렇지 않으면 창 기능을 요청하지 않아야합니다.
내가 보는 방식으로 AppCompat
테마가 변경되었고 한편으로는 몇 가지를 깨뜨리는 것처럼 보였지만 다른 한편으로는 훨씬 더 많은 유연성을 제공합니다. 다음 단계를 따르는 것이 좋습니다.
.NoActionBar
위 인용문에 설명 된대로 활동에 스타일을 사용하십시오.android.support.v7.widget.Toolbar
활동 레이아웃에 추가app:contentInsetStart="0dp"
속성을 설정 합니다. 이것은 귀하의 질문에서 설명하는 여백의 주요 문제입니다.
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/actionBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentInsetEnd="0dp"
app:contentInsetStart="0dp" >
</android.support.v7.widget.Toolbar>
일반적으로 별도의 레이아웃 파일에서 수행하고 include
활동 레이아웃에서 사용하는 것이 좋습니다. 따라서 여러 활동에서 사용하는 경우 한 곳에서 도구 모음을 사용자 정의하면됩니다.
<include layout="@layout/view_action_bar" />
- 사용
findViewById
및setSupportActionBar
활동onCreate
에서signal to the Activity which Toolbar should be treated as the Activity's action bar
Toolbar actionBar = (Toolbar) findViewById(R.id.actionBar);
setSupportActionBar(actionBar);
- 이렇게하면 추가 된 모든 작업
onCreateOptionsMenu
이 도구 모음에 추가되고 활동 작업 표시 줄로 처리됩니다. - 원하는대로 도구 모음을 추가로 사용자 지정합니다 (하위보기 추가 등).
답변
Muzikant가 언급 하고이 답변 처럼 많은 일을하는 대신
getSupportActionBar().setDisplayShowHomeEnabled(false);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
LayoutInflater mInflater = LayoutInflater.from(this);
View mCustomView = mInflater.inflate(R.layout.action_bar_home, null);
getSupportActionBar().setCustomView(mCustomView);
getSupportActionBar().setDisplayShowCustomEnabled(true);
Toolbar parent =(Toolbar) mCustomView.getParent();//first get parent toolbar of current action bar
parent.setContentInsetsAbsolute(0,0);// set padding programmatically to 0dp
문제를 해결하려면 마지막 두 줄의 코드 만 추가하면됩니다.
이것이 당신과 다른 사람에게 도움이되기를 바랍니다.
업데이트 : 그것에 대해 조사한 후이 솔루션이 어떤 경우에는 작동하지 않는다는 것을 알았습니다. 이렇게하면 왼쪽 간격 (HOME 또는 BACK)이 제거되지만 오른쪽 간격 (MENU)은 그대로 유지됩니다. 다음은 이러한 경우에 대한 해결책입니다.
View v = getSupportActionBar().getCustomView();
LayoutParams lp = v.getLayoutParams();
lp.width = LayoutParams.MATCH_PARENT;
v.setLayoutParams(lp);
이 네 줄을 위의 코드에 추가하여 오른쪽 간격도 지원 작업 표시 줄에서 제거합니다.
답변
스타일에서도 할 수 있다고 생각합니다. 이 시도. kitkat에서 테스트했습니다.
<style name="AppTheme" parent="Theme.AppCompat">
<item name="toolbarStyle">@style/AppThemeToolbar</item>
</style>
<style name="AppThemeToolbar" parent="Widget.AppCompat.Toolbar" >
<item name="contentInsetStart">0dp</item>
</style>
답변
다른 답변 중 어느 것도 나를 위해 일하지 않았으므로 여기 에있는 실제 AppCompat v7 스타일을 살펴 보았습니다 .
Base.Widget.AppCompat.ActionBar 스타일을 보면 다음과 같습니다.
<item name="contentInsetStart">@dimen/abc_action_bar_content_inset_material</item>
<item name="contentInsetEnd">@dimen/abc_action_bar_content_inset_material</item>
그래서 분명히 우리는 우리의 액션 바 스타일로 그 속성들을 덮어 쓰기 만하면됩니다 :
<style name="ActionBar" parent="@style/Base.Widget.AppCompat.ActionBar">
<item name="contentInsetStart">0dp</item>
<item name="contentInsetEnd">0dp</item>
</style>
이것은 나를 위해 잘 작동했으며 다른 사람들에게도 도움이되기를 바랍니다.
답변
내 머리를 모니터에 대고 많이 치고 난 후, 이것은 나를 위해 일했습니다.
Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
toolbar.setContentInsetStartWithNavigation(0);
toolbar.setContentInsetEndWithActions(0);
toolbar.setContentInsetsAbsolute(0, 0);
toolbar.setPadding(0, 0, 0, 0);
getCustomView (). getParent ()가 트릭을 한 것입니다.
답변
오늘도이 문제 res/values-v21/styles.xml
가 발생했고 Android Studio에서 자동으로 생성 된 프로젝트 내부에있는 것이 원인이라는 것을 알게되었습니다.
왜?
내 res/values-v21/styles.xml
콘텐츠가 다음과 같았 기 때문입니다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="BaseAppTheme" parent="android:Theme.Material.Light">
</style>
</resources>
그리고 내 res/values/styles.xml
포함 된 내용은 다음과 같습니다.
<style name="BaseAppTheme" parent="android:Theme.Holo.Light">
<!-- Customize your theme here. -->
<item name="android:windowContentOverlay">@null</item>
<item name="android:soundEffectsEnabled">false</item>
</style>
그런 다음 Lollipop에서 내 앱을 실행했을 때 res/values-v21/styles.xml
를 사용했고 OP가 가진 정확한 문제를 일으켰습니다. 그래서 간단한 수정은 그냥 삭제하는 것입니다.
<style name="BaseAppTheme" parent="android:Theme.Material.Light">
</style>
에 res/values-v21/styles.xml
답변
요점 :
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
actionBar.setCustomView(R.layout.actionbar_layout);
Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
toolbar.setContentInsetsAbsolute(0, 0);
toolbar.setPadding(0, 0, 0, 0);
올바른 도구 모음을 가져와야합니다. android.support.v7.widget.Toolbar;