多窗格布局

时间:2012-06-18 11:06:58

标签: android android-layout

我想使用2个面板创建平板电脑应用程序。左边的一个作为菜单,右边的一个作为内容演示者。实际上,我期望的行为类似于Gmail应用中的行为。

enter image description here

我目前正在使用2个片段。一个基本上是带有房间名称和一些按钮的ListView。另一个(内容)包括有关所选房间的一些信息。

我在左侧面板中选择的房间应该保持突出显示 - 就像在Gmail应用中一样。我试图使用选择器达到这个效果好几个小时,但失败了。

此外,我发现了关于这种方法的两种不同意见..

1)"Do not try to keep the focus or selection in touch mode"

2)"In general, use the pane on the right to present more information about the item you selected in the left pane. Make sure to keep the item in the left pane selected in order to establish the relationship between the panels."

你能告诉我如何做到这一点(只是为了保持所选项目与其他项目不同)? 也许ListView不是最好的方法吗?

更新

感谢Christoph Eberhardt的回答,我创建了一个工作正常的示例项目。它可用on github.

1 个答案:

答案 0 :(得分:3)

在res / drawable / list_item_selector.xml

中创建一个xml文件
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@drawable/list_pressed" />
    <item android:drawable="@drawable/list_default" />
</selector>

对于list元素,创建一个自己的xml文件res / layout / list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:paddingLeft="20dp"
    android:background="@drawable/list_item_selector"
/>

然后在创建列表适配器时执行:

setListAdapter(new CustomAdapter<String>(getActivity(),
            R.layout.list_item, stringArray));

现在你所要做的就是提供drawables list_default和list_pressed 和list_altered

CustomAdpater看起来像:

package com.test.listview_keep_selected;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.StateListDrawable;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class CustomAdapter<T> extends ArrayAdapter<T> {

    private Context m_cContext;

    public CustomAdapter(Context context, int textViewResourceId,
            T[] objects) {

        super(context, textViewResourceId, objects);
        this.m_cContext = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final View returnView = super.getView(position, convertView, parent);
        final ListView listView  = (ListView) ((Activity) m_cContext).findViewById(R.id.listViewTest);
        returnView.setOnClickListener(new OnClickListener(
                ) {


            @Override
            public void onClick(View v) {
                for(int i = 0; i< listView.getChildCount(); i++)
                    listView.getChildAt(i).setSelected(false);
                StateListDrawable states = new StateListDrawable();
                states.addState(new int[] {android.R.attr.state_selected},
                        m_cContext.getResources().getDrawable(R.drawable.list_pressed));
                states.addState(new int[] { },
                        m_cContext.getResources().getDrawable(R.drawable.list_altered));
                v.setBackgroundDrawable(states);
                v.setSelected(true);
            }
        });
        return returnView;
    }

}

修改

如果你还没有:

listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

修改 不要使用普通的ListView设置选择模式,只有在有例如我在代码中的ListFragment

现在不是很完美,但是从现在开始你玩得开心就应该没事了。

可能有用的还有:ListView item background via custom selector

修改

现在它应该按照你想要的方式工作^^