我有一种情况,我需要创建一个左面板。我的经理说这应该就像谷歌电视设备上的电视和电影应用程序中使用的那样,它最初只显示图标,然后在右侧展开内容,以便在获得焦点时也显示图标的文本。
我希望选项卡如下图所示(白框是我的链接,红色 ractangle 是我的左侧面板):
放大的图像可以在这里查看
我对左面板的要求是:
当它的任何链接被聚焦时,它应该在右侧部分展开。我觉得动画的宽度应该不难。但是我怎么知道控件是左面板获得/失去焦点
当在左侧面板中单击任何链接时,将单独的活动加载到右侧的 FrameLayout 中......我也使用解决方法完成了它。但我更愿意知道一些体面的好方法。
当用户通过按下 RIGHT D-PAD 按钮聚焦加载的活动时,左侧面板的宽度应该会减小并且应该隐藏图标的文本。
我必须能够使用KEYBOARD在左侧面板和容器FrameLayout中加载的子活动控件之间自由导航。这是因为我的应用程序适用于 Google TV,用户更喜欢使用D-Pad进行导航。这是我面临的主要问题......因为我无法从子控件导航到其父控件的邻居控件
为了获得上述所有要点,我查看了 TabHost,但找不到一种方法让它看起来像我需要的那样。
我也见过themissingtabwidget,但它的垂直选项卡填充了所有垂直可用的空间,并且我无法控制那里的位置,我需要更像左面板的结构,我可以在我想要的任何地方放置链接。所以这也失败了。
现在我决定自己创建一个。我正在按照以下方式进行操作:
- main.xml在根目录
包含一个FrameLayout
- 用于举行活动的FrameLayout - 我已经从左侧设置了它的边距,以便下一个左侧面板适合该空间以及当我为面板的大小设置动画时何时会覆盖在它下方的框架
- 用于保存左侧面板项的相对布局。
Main.xml 如下:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!--
THIS First TabHost IS NOT USED AT ALL.
I JUST PUT IT HERE AS THE underlying TabActivity required it and was giving me error.
You can see its visibility is set to GONE.
You can just minimize it and forget it as its a silly Workaround.
and help me if you know of some better way
-->
<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<TabWidget
android:id="@android:id/tabs"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_weight="0"
android:orientation="vertical" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1" />
</LinearLayout>
</TabHost>
<!--
Activities are loaded here in this frame.
Its margin from Left is set to 150dp to have space.
Its placed on the first place as the second RelativeLayout would be used as Left Panel.
-->
<FrameLayout
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="150dp"
android:nextFocusLeft="@+id/leftpanel"
android:background="#CCAAAA" >
</FrameLayout>
<!--
Left Panel holding links/buttons etc to load a separate activity in above FrameLayout
-->
<RelativeLayout
android:id="@+id/leftpanel"
android:layout_width="200dp"
android:layout_height="fill_parent"
android:background="#33FAFAFA"
android:focusable="True"
android:orientation="vertical" >
<Button
android:id="@+id/btnArtists"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Artists" >
</Button>
<Button
android:id="@+id/btnAlbum"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/btnArtists"
android:text="Album" >
</Button>
<Button
android:id="@+id/btnLogin"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="True"
android:text="Login" >
</Button>
</RelativeLayout>
主要选项卡活动如下:
public class TestActivity extends TabActivity {
FrameLayout container;
Intent artistsIntent;
Intent albumsIntent;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
container = (FrameLayout)findViewById(R.id.container);
artistsIntent = new Intent().setClass(this, ArtistsActivity.class);
albumsIntent = new Intent().setClass(this, AlbumsActivity.class);
Button btnArtist = (Button)findViewById(R.id.btnArtists);
btnArtist.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
container.removeAllViews();
View view = getLocalActivityManager().startActivity("ArtistsActivity",
new Intent(getApplicationContext(), ArtistsActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
container.addView(view);
}
});
Button btnlbum = (Button)findViewById(R.id.btnAlbum);
btnlbum.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
container.removeAllViews();
View view = getLocalActivityManager().startActivity("AlbumsActivity",
new Intent(getApplicationContext(), AlbumsActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
container.addView(view);
}
});
}
}
如您所见,主要的 TestActivity 是一个TabActivity,它提供了实现选项卡的功能。我从TabActivity扩展了我的活动,因为据我所知,这是将活动作为子视图添加到 FrameLayout 的唯一方法。
这也迫使我拥有一个具有该特定名称的TabHost 。所以我添加了它并将其可见性设置为消失以使其停止抱怨。...是的,我知道...这是一个愚蠢的解决方法 ..但是如果我知道一些正确的方法,我就不会在这里...所以如果有更好的方法可以帮助我。
我当前的测试项目的另一个问题是,当我使用右箭头键将焦点放在加载到FrameLayout中的子活动中时。我无法使用左键盘键重新关注左面板中的按钮...
怎么做????????????
我在这里上传了小示例项目。请下载并查看。还要在 AndroidManifest.xml 中将 .TestActivity 的 Theme 设置为 android:theme="@android:style/Theme.Holo" 以按预期全屏查看应用程序。
非常感谢您的帮助。
注意:我正在为 Google TV 创建这个应用程序......导航主要取决于 D-Pad......所以我必须确保我可以使用 Kayboard 到达任何地方。
所以帮助我。