Android 4.0, 작업 표시 줄의 텍스트가 표시되지 않음
Google의 새 API, 특히 작업 표시 줄을 사용하려고합니다.
빌드가 api 10으로 설정되었을 때 메뉴 버튼을 누르면 각각 그림과 아이콘이있는 멋진 메뉴 옵션이 생겼습니다. api 14를 사용할 때 내가 무엇을 시도하든 항상 텍스트가없는 작업 표시 줄에 아이콘을 넣습니다. 나는 내가 생각할 수있는 모든 것을 시도했다. "with text"속성을 지정하고 텍스트를 단일 문자로 변경했지만 (방 문제인 경우) 아무것도 변경하지 않았습니다.
android.developer의 개발자 가이드에서도 이전에이 작업을 수행 한 것을 보았지만 표시하는 방법에 대한 답을 찾을 수없는 것 같습니다.
좁은 작업 표시 줄에 단일 메뉴 항목의 텍스트와 아이콘을 표시하지 않기로 한 Android 개발자의 의식적인 결정이라고 생각합니다. 그러나 정말로 그렇게하고 싶다면 menu.xml 파일에서 android : actionLayout 을 사용할 수 있습니다 . 안드로이드 액션 바 문서는 약간 더 나은 설명이 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_foo"
android:title="@string/menu_foo"
android:icon="@drawable/ic_menu_foo"
android:showAsAction="always"
android:actionLayout="@layout/action_button_foo" />
</menu>
그런 다음 action_button_foo.xml
레이아웃을 만듭니다 .
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="14dp"
android:paddingBottom="14dp"
android:gravity="center"
android:text="@string/menu_foo"
android:drawableLeft="@drawable/ic_menu_foo"
android:background="@drawable/bg_btn_action_bar"
android:clickable="true" />
배경에 선택기를 사용하여 bg_btn_action_bar.xml
탭하면 색상이 변경됩니다.
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:drawable="@drawable/bg_action_bar_pressed" />
<item
android:drawable="@color/transparent" />
</selector>
이제 사용자 지정보기에서 클릭 이벤트를 처리하도록해야합니다. 당신의 활동에서, 나는 onOptionsItemSelected
다른 모든 비 사용자 지정 항목과 함께 클릭 인을 처리 할 수 있도록 이렇게하는 것을 좋아 합니다.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.my_menu, menu);
final MenuItem item = menu.findItem(R.id.menu_foo);
item.getActionView().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onOptionsItemSelected(item);
}
});
return super.onCreateOptionsMenu(menu);
}
이것은 4.0.4를 실행하는 Nexus S에서 관찰 한 것과 확실히 동일합니다. 내 앱은 조각으로 구현 된 여러 탭이있는 작업 표시 줄을 사용합니다. 내 다양한 프래그먼트는 탭이 표시되는 동안 작업 표시 줄에 표시되는 메뉴 옵션을 조정합니다.
Nexus S와 에뮬레이터 (HVGA 및 WVGA800 모두)에서 다음과 같이 일관되게 수행되기 때문에 ICS의 버그로 보입니다.
- 세로 모드에서 내 로고 / 위 버튼은 작업 표시 줄의 맨 위 행에 표시되고 탭은 두 번째 행에 표시되며 모든 작업은 맨 위 행의 오른쪽에 아이콘으로 만 표시됩니다 (텍스트 없음).
- 그러나 가로로 회전하면 작업 표시 줄이 단일 행으로 축소되고 탭이 위쪽 단추 옆에있는 스피너 (드롭 다운 목록)로 위쪽 표시 줄로 이동합니다. 그러나 특히 내 작업 아이콘 옆에 텍스트가 나타납니다.
ICS의이 작은 구석이 약간 지저분하고 버그가 있다고 믿게 만드는 탭 스피너의 다른 결함을 발견했습니다. 애플리케이션이 좁은 디스플레이에서 작업 표시 줄을 분할하도록 지시 android:uiOptions="splitActionBarWhenNarrow"
하면 (매니페스트 에 추가하여 ICS는 여전히 상단에 충분한 공간이 있음에도 불구하고 항상 해당 항목을 하단 표시 줄로 푸시합니다. 추가 표시 줄이 있어도 여전히 텍스트를 표시하지 않고 아이콘 만 표시합니다.
4.0.4를 실행하는 Xoom에서는 공간이 충분하기 때문에 탭과 작업 항목이 항상 예상대로 표시됩니다.
해결 방법 : 세로 모드에서 작업 표시 줄에 텍스트를 표시하려면 아이콘을 포기해야합니다. 메뉴 항목에서 아이콘을 제거하면 텍스트가 나타납니다. 이것은 우리가 추구하는 것과 정확히 다릅니다.
https://code.google.com/p/android/issues/detail?id=30180에 버그 보고서를 게시했습니다 .
Honeycomb의 작업 표시 줄에 옵션 메뉴를 표시하려면 다음을 수행했습니다.
활동에서이 함수를 재정의합니다.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.actionbar_universe, menu);
return true;
}
여기서 R.menu.actionbar_universe는 다음과 같이 메뉴 항목을 정의합니다.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/crossholdings" android:showAsAction="always|withText"
android:title="Cross Holdings" android:icon="@drawable/actionbar_cross"/>
</menu>
showAsAction = "always | withText"를 확인하고 android : title을 지정합니다.
이 기능이 있고 작동하지 않는 경우 여기에 메뉴 리소스를 복사 | 붙여 넣기하십시오.
편집 : 이것은 잘못된 질문에 대한 대답이지만 원본 텍스트입니다.
이 코드를 사용하여 작업 표시 줄의 제목을 설정하고 회사 로고로 빨간색으로 칠합니다. 3.0에서 잘 작동합니다.
public ActionBar setActionBarStyle(String title) {
ActionBar actionBar = setActionBarStyle();
actionBar.setTitle(title);
return actionBar;
}
public ActionBar setActionBarStyle() {
ActionBar actionBar = getActionBar();
ShapeDrawable actionBackground = new ShapeDrawable();
actionBackground.getPaint().setColor(Color.RED);
actionBackground.setBounds(0, 0, 5, 5);
actionBar.setBackgroundDrawable(actionBackground);
actionBar.setDisplayUseLogoEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
return actionBar;
}
"withText"속성은 대부분의 태블릿에서 작동 하지만 더 작은 장치에서 아이콘과 텍스트를 얻는 쉬운 방법은 아이콘 옆에 텍스트를 하나의 이미지 (PNG 파일)로 추가하는 것입니다. 이렇게하면 텍스트와 아이콘이 모두 하나의 아이콘으로 표시되고 전체가 표시됩니다.
withText 속성을 사용하여 태블릿의 원래 아이콘을 사용할 수 있습니다.
res 디렉토리에 "menu-w600dp"라는 추가 메뉴 폴더를 만들어야합니다.
이 폴더의 optionmenu.xml은 600dp보다 큰 화면 너비에만 적용됩니다 (문제없이 아이콘과 텍스트를 표시하는 화면).
XML로 작업 지정 아래의 " 앱이 지원 라이브러리를 사용하는 경우 "섹션을 읽어이 문제를 해결했습니다 .
... Android 2.1만큼 낮은 버전과의 호환성을 위해
android:
네임 스페이스 에서 showAsAction 속성을 사용할 수 없습니다 . 대신이 속성은 지원 라이브러리에서 제공하며 사용자 고유의 XML 네임 스페이스를 정의하고 해당 네임 스페이스를 속성 접두사로 사용해야합니다. (사용자 지정 XML 네임 스페이스는 앱 이름을 기반으로해야하지만 원하는 이름이 될 수 있으며 선언 한 파일 범위 내에서만 액세스 할 수 있습니다.) 예를 들면 다음과 같습니다.
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
<!-- Search, should appear as action button -->
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
yourapp:showAsAction="ifRoom" />
...
</menu>
이 다른 것들이 당신에게 효과가 없다면, 이것이 가능할 것입니다.
저는 많은 옵션을 시도해 보았고 이미지 없이 이상한 코드 줄 없이 간단한 "트릭" 을 생각해 냈습니다 . 그리고 사용자 정의 actionLayout을 사용한 첫 번째 솔루션은 API 레벨 10 호환성으로 저에게 효과적이지 않았습니다.
작은 작업 표시 줄에 텍스트와 아이콘을 표시하려면 공간이 있다는 것을 의미합니다. 따라서 2 개의 메뉴 항목을 사용할 수 있습니다.
- 먼저 아이콘 만 사용 (경고 무시, 제목을 설정하면 태블릿이 두 번 표시됨)
- 두 번째로 텍스트 만
그리고 필요한 경우 'ifRoom'에 대한 텍스트 작업을 선택하여 공간이 필요한 경우 텍스트가 사라지도록합니다. 액션 바에 더 많은 공간이 필요하지만 저에게는 좋은 타협이었습니다. 다음 코드로 끝납니다.
<item
android:id="@+id/menu_save"
android:icon="@drawable/save"
pelmel:showAsAction="always">
</item>
<item
android:id="@+id/menu_save_text"
android:title="@string/profileSave"
pelmel:showAsAction="ifRoom">
</item>
( 편집 여기서 "pelmel"은 앱 이름 END EDIT )
그런 다음 선택 핸들러는 두 ID를 모두 잡아야합니다.
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_save:
case R.id.menu_save_text:
// Your code here
return true;
}
}
대략 dgmltn을 기반으로 한 또 다른 옵션이 있습니다. 이점들:
- 더 많은 제어-예를 들어, 레이아웃에서 텍스트와 이미지를 교체했습니다.
- 사용하기 쉬움-활동 / 조각에 두 줄만 추가하면됩니다.
- 두 개의 추가 파일 만 필요합니다.
- 아마도 약간 더 정확할 수 있지만 여전히 약간의 해킹 IMO입니다.
이 예제에서는 ActionBarSherlock을 사용하고 있다고 가정했습니다. 먼저 원하는보기 레이아웃을 만듭니다. 이것은 ActionBarSherlock을 기반으로합니다. 내가 변경 한 것은 이미지 / 뷰를 교체하고 공유 여백 / 패딩을 0으로 줄여 더 가깝게 만들고 모든 ABS 스타일을 해결하는 것입니다.
<com.example.views.ActionMenuTextItemView xmlns:android="http://schemas.android.com/apk/res/android"
style="@android:style/Widget.Holo.ActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:addStatesFromChildren="true"
android:focusable="true"
android:gravity="center"
android:clickable="true"
android:paddingLeft="4dip"
android:paddingRight="4dip" >
<com.actionbarsherlock.internal.widget.CapitalizingButton
android:id="@+id/abs__textButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@null"
android:ellipsize="none"
android:focusable="false"
android:minHeight="48dip"
android:minWidth="48dip"
android:paddingBottom="4dip"
android:paddingLeft="4dip"
android:paddingRight="0dip"
android:paddingTop="4dip"
android:singleLine="true"
android:textAppearance="@android:style/TextAppearance.Holo.Widget.ActionBar.Menu"
android:textColor="#fff3f3f3" />
<ImageButton
android:id="@+id/abs__imageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="4dip"
android:layout_marginLeft="0dip"
android:layout_marginRight="4dip"
android:layout_marginTop="4dip"
android:adjustViewBounds="true"
android:background="@null"
android:focusable="false"
android:scaleType="fitCenter"
android:visibility="gone" />
</com.example.views.ActionMenuTextItemView>
그런 다음 해당 View
클래스를 만듭니다 . CapitalizingButton
내부적 인 것을 사용하는 것이 걱정된다면 복사 하는 것이 좋습니다. 오, 또한 최소 너비를 고정하지 않았습니다. 그래도 정말 중요하다고 생각하지 마십시오.
package com.example.views;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.accessibility.AccessibilityEvent;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import com.actionbarsherlock.R;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.app.SherlockListActivity;
import com.actionbarsherlock.app.SherlockListFragment;
import com.actionbarsherlock.internal.widget.CapitalizingButton;
import com.actionbarsherlock.view.MenuItem;
@SuppressLint({ "NewApi" })
public class ActionMenuTextItemView extends LinearLayout implements OnClickListener
{
private ImageButton mImageButton;
private CapitalizingButton mTextButton;
private Object mTarget;
private MenuItem mItem;
// Set up all the data. Object must be a sherlock activity or fragment with an onMenuItemSelected().
public void initialise(MenuItem item, Object target)
{
mItem = item;
mTarget = target;
setIcon(mItem.getIcon());
setTitle(mItem.getTitle());
}
public ActionMenuTextItemView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public ActionMenuTextItemView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
public void onFinishInflate()
{
super.onFinishInflate();
mImageButton = (ImageButton) findViewById(R.id.abs__imageButton);
mTextButton = (CapitalizingButton) findViewById(R.id.abs__textButton);
mImageButton.setOnClickListener(this);
mTextButton.setOnClickListener(this);
setOnClickListener(this);
}
@Override
public void setEnabled(boolean enabled)
{
super.setEnabled(enabled);
mImageButton.setEnabled(enabled);
mTextButton.setEnabled(enabled);
}
public void setIcon(Drawable icon)
{
mImageButton.setImageDrawable(icon);
if (icon != null)
mImageButton.setVisibility(VISIBLE);
else
mImageButton.setVisibility(GONE);
}
public void setTitle(CharSequence title)
{
mTextButton.setTextCompat(title);
setContentDescription(title);
}
@Override
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event)
{
onPopulateAccessibilityEvent(event);
return true;
}
@Override
public void onPopulateAccessibilityEvent(AccessibilityEvent event)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
super.onPopulateAccessibilityEvent(event);
final CharSequence cdesc = getContentDescription();
if (!TextUtils.isEmpty(cdesc))
event.getText().add(cdesc);
}
@Override
public boolean dispatchHoverEvent(MotionEvent event)
{
// Don't allow children to hover; we want this to be treated as a single component.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
return onHoverEvent(event);
return false;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int minWidth = 0;
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
final int specSize = MeasureSpec.getSize(widthMeasureSpec);
final int oldMeasuredWidth = getMeasuredWidth();
final int targetWidth = widthMode == MeasureSpec.AT_MOST ? Math.min(specSize, minWidth) : minWidth;
if (widthMode != MeasureSpec.EXACTLY && minWidth > 0 && oldMeasuredWidth < targetWidth)
{
// Remeasure at exactly the minimum width.
super.onMeasure(MeasureSpec.makeMeasureSpec(targetWidth, MeasureSpec.EXACTLY), heightMeasureSpec);
}
}
@Override
public void onClick(View v)
{
if (mTarget == null)
return;
else if (mTarget instanceof SherlockActivity)
((SherlockActivity)mTarget).onOptionsItemSelected(mItem);
else if (mTarget instanceof SherlockFragmentActivity)
((SherlockFragmentActivity)mTarget).onOptionsItemSelected(mItem);
else if (mTarget instanceof SherlockListActivity)
((SherlockListActivity)mTarget).onOptionsItemSelected(mItem);
else if (mTarget instanceof SherlockListFragment)
((SherlockListFragment)mTarget).onOptionsItemSelected(mItem);
else if (mTarget instanceof SherlockFragment)
((SherlockFragment)mTarget).onOptionsItemSelected(mItem);
else
throw new IllegalArgumentException("Target must be a sherlock activity or fragment.");
}
}
이제 사용할 준비가되었습니다. 텍스트를 포함 할 메뉴 항목에서 dgmltn이 말한 것과 동일하게 수행합니다.
<item
android:id="@+id/menu_foo"
android:icon="@drawable/..."
android:showAsAction="always|withText" // Doesn't do anything really.
android:title="Sell"
android:titleCondensed="Sell"
android:actionLayout="@layout/view_action_menu_text_item"/> // Or whatever you called it.
And finally, just add this code to your activity/fragment:
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
getSupportMenuInflater().inflate(R.menu.activity_main, menu);
// The magic lines.
MenuItem it = menu.findItem(R.id.menu_foo);
((ActionMenuTextItemView)it.getActionView()).initialise(it, this);
And that's it!
참고URL : https://stackoverflow.com/questions/9282122/android-4-0-text-on-the-action-bar-never-shows
'development' 카테고리의 다른 글
C ++는 컴파일 타임 카운터를 지원합니까? (0) | 2020.12.08 |
---|---|
git push : 마지막 커밋을 제외한 모든 커밋 푸시 (0) | 2020.12.08 |
Rpresentation Markdown에서 실행되지 않는 코드 포함 (0) | 2020.12.08 |
오류 : 원인 : buildToolsVersion이 지정되지 않았습니다. (0) | 2020.12.08 |
파이썬에 중첩 될 수있는 정적 블록의 수에 제한이있는 이유는 무엇입니까? (0) | 2020.12.08 |