Android Lollipop, AppCompat ActionBar 사용자 정의보기가 전체 화면 너비를 차지하지 않음
그래서 방금 코드베이스를 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
업데이트 의 에 대한 최신 변경 사항으로 인해 발생한 것 같습니다 . 작업 표시 줄을 처리하는 방법이 크게 변경된 것 같습니다.
I faced the same issue and after reading the ActionBar
documentation, and especially the following quote I found a solution.
Beginning with Android L (API level 21), the action bar may be represented by any Toolbar widget within the application layout. The application may signal to the Activity which Toolbar should be treated as the Activity's action bar. Activities that use this feature should use one of the supplied .NoActionBar themes, set the windowActionBar attribute to false or otherwise not request the window feature.
The way I see it, the AppCompat
themes were changed and on one hand seemed to break a few things but provide much more flexibility on the other. I recommend following these steps:
- Use
.NoActionBar
style in your activity as described in the above quote - Add a
android.support.v7.widget.Toolbar
to your Activity layout - Set the
app:contentInsetStart="0dp"
attribute. This is the main issue with the margin that you describe in your question
<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>
It's usually recommended that you do that in a separate layout file and use include
in your activity layout so you will only need to customize the Toolbar in one place if used in multiple activities
<include layout="@layout/view_action_bar" />
- Use
findViewById
andsetSupportActionBar
in your ActivityonCreate
tosignal to the Activity which Toolbar should be treated as the Activity's action bar
Toolbar actionBar = (Toolbar) findViewById(R.id.actionBar);
setSupportActionBar(actionBar);
- Once you do that, all actions added in
onCreateOptionsMenu
will be added to the toolbar and it will be treated as the activity action bar. - Further customize the Toolbar as desired (Add child views etc.)
Instead of doing so much of work as mentioned by Muzikant and like this answer
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
You have to add only the last two lines of code to solve your problem.
I hope this might help you and anyone else.
UPDATE: After making some research on it, i found that this solution will not work in some cases. The left side gap (HOME or BACK) will be removed with this but the right side gap (MENU) will remain as is. Below is the solution in these cases.
View v = getSupportActionBar().getCustomView();
LayoutParams lp = v.getLayoutParams();
lp.width = LayoutParams.MATCH_PARENT;
v.setLayoutParams(lp);
Add these four lines to above code, so that the right side gap is also removed from support action bar.
I think you can also do that in styles. try this. tested it on 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>
None of the other answers worked for me, so I took a look at the actual AppCompat v7 styles, found here.
If you look at the Base.Widget.AppCompat.ActionBar style, it has:
<item name="contentInsetStart">@dimen/abc_action_bar_content_inset_material</item>
<item name="contentInsetEnd">@dimen/abc_action_bar_content_inset_material</item>
So obviously we just need to override those properties in our own action bar style:
<style name="ActionBar" parent="@style/Base.Widget.AppCompat.ActionBar">
<item name="contentInsetStart">0dp</item>
<item name="contentInsetEnd">0dp</item>
</style>
This worked great for me, hope it helps others too.
After much beating my head against the monitor, this worked for me
Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
toolbar.setContentInsetStartWithNavigation(0);
toolbar.setContentInsetEndWithActions(0);
toolbar.setContentInsetsAbsolute(0, 0);
toolbar.setPadding(0, 0, 0, 0);
The getCustomView().getParent() is what did the trick
I just encountered this problem today as well, then I found out I was having res/values-v21/styles.xml
inside my project which was generated automatically by Android Studio and that's the cause.
Why?
Because my res/values-v21/styles.xml
's content was:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="BaseAppTheme" parent="android:Theme.Material.Light">
</style>
</resources>
And my res/values/styles.xml
contained something like:
<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>
Then when I ran my app on Lollipop, the res/values-v21/styles.xml
was used, and that caused exact problem that OP had. So I came to a simple fix is just deleting:
<style name="BaseAppTheme" parent="android:Theme.Material.Light">
</style>
in res/values-v21/styles.xml
to the point:
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);
make sure importing the right toolbar - android.support.v7.widget.Toolbar;
Write these two line in addition with your code
Toolbar toolbar=(Toolbar)viewActionBar.getParent();
toolbar.setContentInsetsAbsolute(0,0);
'program tip' 카테고리의 다른 글
변수 이름을 사용한 루비 정규식 (0) | 2020.08.25 |
---|---|
Xcode 4에서 헤더와 구현 파일 사이를 어떻게 전환합니까? (0) | 2020.08.25 |
UITextView에서 링크 클릭을 차단하는 방법은 무엇입니까? (0) | 2020.08.25 |
Git은 새 하위 모듈을 초기화 / 동기화 / 업데이트하지 않습니다. (0) | 2020.08.25 |
PostgreSQL은 JSON 배열로 결과 집합을 반환합니까? (0) | 2020.08.25 |