选项卡式操作栏界面适合屏幕,setMaxWidth不会缩放到屏幕

时间:2016-03-22 16:47:56

标签: android android-layout android-fragments

目标:

我希望有一个标签式界面,所有标签随时都可见。

问题:

我无法在创建的标签之间拆分屏幕宽度,以免它们溢出(请参阅第二次屏幕截图)。基于这个(Change tab width in ActionBar.Tab)SO问题和讨论,我使用了那里提出的解决方案作为基础。函数“setMaxWidth()”可用于限制视图宽度。通过将每个标签限制为屏幕宽度的一部分,它们应该都适合。

setMaxWidth(screenWidth*tabTextSize[i]/tabTextSizeSum);

但要实现这一点,我需要进入所有标签的视图。我尝试使用setCustomview(layoutResId)为每个标签执行此操作,然后通过getCustomView()与他们联系。但结果(如屏幕截图1中所示)导致标签文本为文字“假”。

那么,有没有办法缩放标签以适应屏幕而不会溢出?

截图:

Screenshot1 http://i68.tinypic.com/1567o9k.png

很难看到,但有6个标签,约占动作栏区域的2/3,每个标签中都有“假”字样。

Screenshot2 http://i64.tinypic.com/2jcahw2.png

如果删除了标签具有customView集和最后一个for循环的行,则标签看起来不错,除非不适合屏幕。

代码:

MainActivity.java

package com.example;

import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.app.Activity;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;

public class MainActivity extends Activity {
    // Declare Tab Variable
    ActionBar.Tab TabTool, TabSchedule, TabMessage, TabTNT, TabAlarm, TabOverview;
    Fragment fragmentTool =     new FragmentTabToolChange();
    Fragment fragmentSchedule = new FragmentTabSchedule();
    Fragment fragmentMessage =  new FragmentTabMessage();
    Fragment fragmentTNT=       new FragmentTabTNT();
    Fragment fragmentAlarm =    new FragmentTabAlarm();
    Fragment fragmentOverview = new FragmentTabOverview();

    DisplayMetrics displaymetrics = new DisplayMetrics();
    int screenWidth;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        screenWidth = displaymetrics.widthPixels;

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);

        ActionBar actionBar = getActionBar();

        // Hide Actionbar Icon
        actionBar.setDisplayShowHomeEnabled(false);

        // Hide Actionbar Title
        actionBar.setDisplayShowTitleEnabled(false);


        // Set Tab Icon and Titles
        TabTool = actionBar.newTab().setText(R.string.toolText);
        TabSchedule = actionBar.newTab().setText(R.string.scheduleText);
        TabMessage = actionBar.newTab().setText(R.string.messageText);
        TabTNT = actionBar.newTab().setText(R.string.tntText);
        TabAlarm = actionBar.newTab().setText(R.string.alarmText);
        TabOverview = actionBar.newTab().setText(R.string.overviewText);

        // Set Tab Listeners
        TabTool.setTabListener(new TabListener(fragmentTool));
        TabSchedule.setTabListener(new TabListener(fragmentSchedule));
        TabMessage.setTabListener(new TabListener(fragmentMessage));
        TabTNT.setTabListener(new TabListener(fragmentTNT));
        TabAlarm.setTabListener(new TabListener(fragmentAlarm));
        TabOverview.setTabListener(new TabListener(fragmentOverview));

        View toolView = findViewById(R.id.toolTextView);

        TabTool.setCustomView(toolView);
        TabSchedule.setCustomView(findViewById(R.id.scheduleTextView));
        TabMessage.setCustomView(findViewById(R.id.messageTextView));
        TabTNT.setCustomView(findViewById(R.id.tntTextView));
        TabAlarm.setCustomView(findViewById(R.id.alarmTextView));
        TabOverview.setCustomView(findViewById(R.id.overViewTextView));

        // Add tabs to actionbar
        actionBar.addTab(TabTool);
        actionBar.addTab(TabSchedule);
        actionBar.addTab(TabMessage);
        actionBar.addTab(TabTNT);
        actionBar.addTab(TabAlarm);
        actionBar.addTab(TabOverview);

        // Scale tab widths to fit window
        View tabView = actionBar.getTabAt(0).getCustomView();


        final int tabSize = actionBar.getTabCount();
        final int[] tabTextSize = new int[tabSize];

        int tabTextSizeSum = 0;
        for (int i = 0; i < tabSize; i++)
        {
            tabTextSize[i] = actionBar.getTabAt(i).getText().length();
            tabTextSizeSum += tabTextSize[i];
        }
        for (int i = 0; i < tabSize; i++)
        {
            TextView tab = (TextView) actionBar.getTabAt(i).getCustomView();

            tab.setMaxWidth(screenWidth*tabTextSize[i]/tabTextSizeSum);
        }

        // Create Actionbar Tabs
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    }
}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/toolTextView"
        android:layout_width="wrap_content"
        android:layout_height="71dp"
        android:text="@+id/string.toolText" />
    <TextView
        android:id="@+id/scheduleTextView"
        android:layout_width="wrap_content"
        android:layout_height="71dp"
        android:text="@+id/string.scheduleText" />
    <TextView
        android:id="@+id/messageTextView"
        android:layout_width="wrap_content"
        android:layout_height="71dp"
        android:text="@+id/string.messageText"/>
    <TextView
        android:id="@+id/tntTextView"
        android:layout_width="wrap_content"
        android:layout_height="71dp"
        android:text="@+id/string.tntText" />
    <TextView
        android:id="@+id/alarmTextView"
        android:layout_width="wrap_content"
        android:layout_height="71dp"
        android:text="@+id/string.alarmText" />
    <TextView
        android:id="@+id/overViewTextView"
        android:layout_width="wrap_content"
        android:layout_height="71dp"
        android:text="@+id/string.overviewText" />

</FrameLayout>

版本数据:

AndroidStudio版本:1.5.1

Android SDK版本:19

buildToolsVersion 23.0.1

0 个答案:

没有答案