【问题标题】:How do I show a programmatically set layout on the first draw?如何在第一次绘制时显示以编程方式设置的布局?
【发布时间】:2012-07-10 09:36:18
【问题描述】:

我有这个 LinearLayout,它是 RelativeLayout 的子级以及 ListView 等:

<LinearLayout
    android:id="@+id/color_bar"
    android:layout_alignParentBottom="true"
    android:layout_weight="1"
    android:layout_width="match_parent"
    android:layout_height="16dp"
    android:padding="0dp"
    android:orientation="horizontal"
>
    <TextView
        android:id="@+id/space_used_bar"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="#006688"
        android:padding="0dp"
    />
    <TextView
        android:id="@+id/space_free_bar"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="#444444"
        android:padding="0dp"
    />
</LinearLayout>

我不打算在这些 TextView 中放置任何文本;他们只是为了他们的背景颜色值。我想以编程方式设置这两个 TextView 的宽度,我可以这样做,但问题是第一次呈现 LinearLayout 时,它没有被绘制。它没有大小,我也看不到其中包含的 TextView。当用户几乎做任何事情(例如锁定屏幕、按下主页按钮、单击列表项、选择选项项等)时,TextViews 会正确显示。只是在活动打开的第一刻,TextViews 和 Layout 根本没有出现。有谁知道问题可能是什么?

附:我已经尝试在 LinearLayout 以及各个 TextViews 上调用 invalidate。

编辑:这里是回调

@Override
public void onCreate(Bundle savedInstanceState)
{
    //Log.d(TAG, "onCreate()");

    super.onCreate(savedInstanceState);
    setContentView(R.layout.browser);
    topMenu = getActionBar();
    lv = (ListView) findViewById(R.id.file_list);
    spaceUsedBar = (TextView) findViewById(R.id.space_used_bar);
    spaceFreeBar = (TextView) findViewById(R.id.space_free_bar);
    spaceUsed = (TextView) findViewById(R.id.space_used);
    spaceFree = (TextView) findViewById(R.id.space_free);
    colorBar = (LinearLayout) findViewById(R.id.color_bar);
    stat = new StatFs(Environment.getExternalStorageDirectory().getPath());

    if (savedInstanceState == null)
    {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
            currentDirectory = externalStorageDirectory;
        else
        {
            currentDirectory = new File(ROOT_DIR);
            Toast t = Toast.makeText(c, R.string.not_mounted, Toast.LENGTH_SHORT);
            t.show();
        }
    }
    else
    {
        currentDirectory = new File(savedInstanceState.getString("savedPath"));
        int savedPosition = savedInstanceState.getInt("savedPosition");
        int savedListTop = savedInstanceState.getInt("savedListTop");
        if (savedPosition >= 0)
            lv.setSelectionFromTop(savedPosition, savedListTop);
    }
}

@Override
public void onStart()
{
    //Log.d(TAG, "onStart()");

    super.onStart();
    lv.setOnItemClickListener(this);
    lv.setMultiChoiceModeListener(this);
    browseTo(currentDirectory);
}

@Override
public void onResume()
{
    //Log.d(TAG, "onResume()");

    super.onResume();
}

【问题讨论】:

    标签: android textview android-linearlayout


    【解决方案1】:

    我猜您在为 TextViews 设置新宽度后以及当系统在用户离开然后返回(锁定屏幕、主页按钮、方向更改等)后重绘布局时还没有重绘布局。但是我没有看到你的 onCreate() 和 onResume() 代码,所以这只是一个猜测......

    【讨论】:

    • 是的,这就是让我感到困惑的部分。我已经浏览了在它们出现之前发生的所有代码,这似乎是完全任意的。我会尽快发布代码。
    【解决方案2】:

    我不确定这是否可行,但请尝试以下方法之一(在 textviews 上)。例如,您为其分配一些初始宽度或重量,然后在该代码执行时以编程方式相应地调整它...

    android:layout_width="40dp"
    

    如果您希望它们占据屏幕的百分比,请使用 weight 属性:

    android:layout_weight="2"
    

    【讨论】:

    • 是的,我已经这样做了,虽然它会让它们显示出来,但它们不是我在代码中指定的宽度。它们首先按照布局定义显示,然后更改为通过我的代码指定的大小。
    猜你喜欢
    • 2012-05-31
    • 1970-01-01
    • 2011-03-21
    • 2011-02-20
    • 2020-06-23
    • 1970-01-01
    • 2022-10-19
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多