PreferenceActivity 分屏显示 分析

原创 2013年12月05日 21:17:57

先上效果图:



PreferenceActivity 设置代码如下,通过getListView 遍历视图结构,主要调整间距与背景色

package com.example.testsettings;

import java.util.List;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewParent;
import android.widget.LinearLayout;

public class MainActivity extends PreferenceActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		
		super.onCreate(savedInstanceState);
		DEBUG("onCreate");
		System.out.println(isMultiPane());
		if (onIsMultiPane()) {// 可以分屏
			DEBUG("分屏显示");
		}

		ViewParent viewParent = getListView().getParent().getParent();
		LinearLayout linearLayout = (LinearLayout) viewParent;

		DEBUG(viewParent.toString());

		DEBUG(getListView().toString());
		// 与getListView() 的效果一样
		DEBUG(findViewById(android.R.id.list).toString());
		// ListView 背景
		getListView().setBackgroundColor(Color.BLUE);
		getListView().setPadding(10, 10, 10, 10);

		LinearLayout.LayoutParams params1 = (android.widget.LinearLayout.LayoutParams) getListView()
				.getLayoutParams();
		params1.setMargins(10, 10, 10, 10);

		DEBUG(findViewById(android.R.id.content).toString());
		// 根容器,包括ListView 和 右边
		View view = findViewById(android.R.id.content);
		view.setBackgroundColor(Color.GREEN);// 整个背景色

		// 容纳Listview的linearLayout
		ViewParent parent = getListView().getParent();
		LinearLayout linearLayout2 = (LinearLayout) parent;

		DEBUG(linearLayout2.getChildCount());
		DEBUG(linearLayout2.getChildAt(0).toString());
		DEBUG(linearLayout2.getChildAt(1).toString());

		// LinearLayout 放置 Listview的LinearLayout 和 右边的LinearLayout
		// 水平放置
		ViewParent parent2 = getListView().getParent().getParent();
		LinearLayout linearLayout3 = (LinearLayout) parent2;
		// 设置 水平分割线
		linearLayout3.setDividerDrawable(getResources().getDrawable(
				R.drawable.splite));
		linearLayout3.setDividerPadding(5);
		linearLayout3.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
		linearLayout3.setPadding(10, 10, 10, 10);

		DEBUG(linearLayout3.getChildCount());
		// 获取右边 PreferenceFrameLayout 容器的 上级
		View view2 = linearLayout3.getChildAt(1);
		view2.setBackgroundColor(Color.BLACK);// 右边容器的背景色
		view2.setPadding(0, 0, -30, 0);// 调整 内间距
		
		DEBUG(((LinearLayout) view2).getChildCount());
		LinearLayout linearLayout4 = (LinearLayout) view2;
		DEBUG(linearLayout4.getChildAt(1).toString());
		DEBUG("右边容器");
		// 获取 右边PreferenceFrameLayout 容器
		View view3 = linearLayout4.getChildAt(1);
		
		LinearLayout.LayoutParams params = (android.widget.LinearLayout.LayoutParams) view3
				.getLayoutParams();
		params.setMargins(-20, 10, 5, 5);// 调整外间距

		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public void onBuildHeaders(List<Header> target) {
		// TODO Auto-generated method stub
		DEBUG("onBuildHeaders");
		super.onBuildHeaders(target);
		//加载Listview的选项
		loadHeadersFromResource(R.xml.settings_header, target);
	}
	@Override
	public void switchToHeader(Header header) {
		//更改ActionBar 的title ,默认会是Listview的第一个,并且在manifest中配置Activity的title也没用

		DEBUG("switchToHeader");
		header.breadCrumbTitle = "设置";
		super.switchToHeader(header);
	}

	@Override
	protected void onStart() {
		DEBUG("onStart");
		super.onStart();
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		DEBUG("onResume");
		super.onResume();
	}

	private void DEBUG(Object msgString) {
		Log.i(this.getClass().getSimpleName(), String.valueOf(msgString));
	}

}

PreferenceActivity的layout 源码如下,根据屏幕大小,会自动适配,我的是平板,使用preference_list_content.xml:


<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/assets/res/layout/list_content.xml
**
** Copyright 2006, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1">

        <LinearLayout
            android:id="@+id/headers"
            android:orientation="vertical"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_marginRight="@dimen/preference_screen_side_margin_negative"
            android:layout_marginLeft="@dimen/preference_screen_side_margin"
            android:layout_weight="@integer/preferences_left_pane_weight">
			<!-- ListView 放置左边Header -->
            <ListView android:id="@android:id/list"
                android:layout_width="match_parent"
                android:layout_height="0px"
                android:layout_weight="1"
                android:paddingLeft="@dimen/preference_screen_header_padding_side"
                android:paddingRight="@dimen/preference_screen_header_padding_side"
                android:paddingTop="@dimen/preference_screen_header_vertical_padding"
                android:paddingBottom="@dimen/preference_screen_header_vertical_padding"
                android:clipToPadding="false"
                android:scrollbarStyle="@integer/preference_screen_header_scrollbarStyle"
                android:drawSelectorOnTop="false"
                android:cacheColorHint="@android:color/transparent"
                android:listPreferredItemHeight="48dp"
                android:scrollbarAlwaysDrawVerticalTrack="true" />

            <FrameLayout android:id="@+id/list_footer"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="0" />

        </LinearLayout>

        <LinearLayout
                android:id="@+id/prefs_frame"
                style="?attr/preferencePanelStyle"
                android:layout_width="0px"
                android:layout_height="match_parent"
                android:layout_weight="@integer/preferences_right_pane_weight"
                android:orientation="vertical"
                android:visibility="gone" >

            <!-- Breadcrumb inserted here, in certain screen sizes. In others, it will be an
                empty layout or just padding, and PreferenceActivity will put the breadcrumbs in
                the action bar. -->
            <include layout="@layout/breadcrumbs_in_fragment" />
				<!-- PreferenceFrameLayout 右边PreferenceFragment 切换的容器 -->
            <android.preference.PreferenceFrameLayout android:id="@+id/prefs"
                    android:layout_width="match_parent"
                    android:layout_height="0dip"
                    android:layout_weight="1"
                />
        </LinearLayout>
    </LinearLayout>

    <RelativeLayout android:id="@+id/button_bar"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_weight="0"
        android:visibility="gone">

        <Button android:id="@+id/back_button"
            android:layout_width="150dip"
            android:layout_height="wrap_content"
            android:layout_margin="5dip"
            android:layout_alignParentLeft="true"
            android:text="@string/back_button_label"
        />
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true">

            <Button android:id="@+id/skip_button"
                android:layout_width="150dip"
                android:layout_height="wrap_content"
                android:layout_margin="5dip"
                android:text="@string/skip_button_label"
                android:visibility="gone"
            />

            <Button android:id="@+id/next_button"
                android:layout_width="150dip"
                android:layout_height="wrap_content"
                android:layout_margin="5dip"
                android:text="@string/next_button_label"
            />
        </LinearLayout>
    </RelativeLayout>
</LinearLayout>


接下来,说下 PreferenceFragment 两个方法的用法问题:

1.addPreferencesFromResource(int resId)

2.

public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {}

如果你要重写onCreateView的返回View,那么填充该view 的layout 一定要含有 一个ListView,并且 android:id="@android:id/list"

那么,你使用addPreferencesFromResource 加载的一系列 Preference,会自动填充到 自定义VIew 的ListView 中,所以你可以控制 那些preference在你的自定义View中的位置。


我上面那个效果图的代码如下:

package com.example.testsettings.fragment;

import com.example.testsettings.R;

import android.content.Intent;
import android.os.Bundle;
import android.os.Debug;
import android.preference.PreferenceFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class VersionFragment extends PreferenceFragment {

	private TextView tVersion = null;
	private Button btnVersionInfo = null;
	private Button btnUpdate = null;

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		DEBUG("onActivityCreated");
		super.onActivityCreated(savedInstanceState);
	}

	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		DEBUG("onActivityResult");
		super.onActivityResult(requestCode, resultCode, data);
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		DEBUG("onCreate");
		super.onCreate(savedInstanceState);
		addPreferencesFromResource(R.xml.fragment_version_head);
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		DEBUG("onCreateView");

		View view = inflater.inflate(R.layout.layout_f_version, container,
				false);
		initView(view);

		return view;
	}

	private void initView(View view) {
		tVersion = (TextView) view.findViewById(R.id.tv_versionName);
		btnUpdate = (Button) view.findViewById(R.id.btn_update);
		btnVersionInfo = (Button) view.findViewById(R.id.btn_versionInfo);
		btnUpdate.setOnClickListener(clickListener);
		btnVersionInfo.setOnClickListener(clickListener);

	}

	private OnClickListener clickListener = new OnClickListener() {

		@Override
		public void onClick(View v) {
			switch (v.getId()) {
				case R.id.btn_update :
					DEBUG("立即升级");
					break;
				case R.id.btn_versionInfo :
					DEBUG("版本信息");
					break;

				default :
					break;
			}

		}
	};

	@Override
	public void onDestroy() {
		DEBUG("onDestroy");
		super.onDestroy();
	}

	@Override
	public void onDestroyView() {
		DEBUG("onDestroyView");
		super.onDestroyView();
	}

	@Override
	public void onStart() {
		DEBUG("onStart");
		super.onStart();
	}

	@Override
	public void onStop() {
		DEBUG("onStop");
		super.onStop();
	}

	@Override
	public void onPause() {
		DEBUG("onPause");
		super.onPause();
	}

	@Override
	public void onResume() {
		DEBUG("onResume");
		super.onResume();
	}

	private void DEBUG(String msg) {
		Log.i(this.getClass().getSimpleName(), "--" + msg + "--");
	}
}

View 的layout :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   android:background="#ff0000"
   
    android:orientation="vertical" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher" />

        <TextView
            android:id="@+id/tv_versionName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="当前版本"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal" >

            <Button
                android:id="@+id/btn_update"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="立即升级" />

            <Button
                android:id="@+id/btn_versionInfo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="15dp"
                android:text="版本信息" />
        </LinearLayout>
        
        <!-- ListView 若写在这下面,那么 那个"版本信息"的 PreferenceCategy 将出现在这里 -->
       <!--  <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView> -->
    </LinearLayout>

</LinearLayout>


addPreferencesFromResource 的xml 如下:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <PreferenceCategory android:title="版本信息"></PreferenceCategory>

</PreferenceScreen>


当然,我如上的代码是有问题的,毕竟使用PreferenceActivity的是要用到它帮我们自动的保持一些设置的数据,我单纯的实现上面的效果,是可以通过仿照PreferenceActivity的布局样式,用FragmentActivity来实现的,head切换的封装也可以参考PreferenceActivity的封装来实现,也可以参照,android eclipse创建Application时选择 Master/Detail Flow 的实现方法。此处就不罗列了.

 接下来再谈一个问题,就是关于PreferenceActivity ListView 自定义的问题,可以调整它的显示,实现类似android Settings 一样的效果,例如,添加带switch开关的Preference ,参加Settings 源码中的 

private static class HeaderAdapter extends ArrayAdapter<Header> {}




相关文章推荐

android google 分屏 多窗口 popup无法显示故障分析

原创无极限,欢迎加微信公众号 code_gg_home ,关注更多内容问题描述 [Message][Input method]Display is wrong when message at spl...

google 分屏 popup无法显示故障分析

问题描述 [Message][Input method]Display is wrong when message at split mode. 分屏模式下短信界面显示不正确 操作步骤 1.打...

一篇介绍PPT如何分屏显示的宝典

  • 2010年09月22日 10:27
  • 281KB
  • 下载

分屏显示实例

  • 2013年06月17日 17:40
  • 182KB
  • 下载

c# Winform/WPF 开发分屏显示应用程序

分屏显示即可把一台主机内运行的多个程序分别显示在不同的两个(或多个)屏幕上。目前市面上主流的显卡都支持分屏显示(显示双屏幕),如果需要显示2个以上的屏幕,则应使用“拖机卡”类的硬件。 设置分屏显示的...
  • soft2buy
  • soft2buy
  • 2011年12月18日 23:34
  • 12881

windows下分屏显示多个桌面

  • 2014年03月20日 17:50
  • 53KB
  • 下载

vi下的分屏显示操作

这是两个常用到的分屏显示的命令:vsp是左右分屏显示,sp是上下分屏显示。...

分屏显示图片(Jquery)

因项目需要,页面上需要按需加载图片,借鉴了一下jquery.lazy插件的实现方式,自己写了一个。 //分屏显示图片 function showImg() { var Cur_Windo...
  • yw1688
  • yw1688
  • 2012年08月24日 17:31
  • 720

设置电脑分屏显示的4种情况

在笔记本上编程时,由于屏幕太小只有14寸,不方便编写和查看源代码,所以买了一个19寸的液晶显示器,这时就需要用到鼠标右键里【屏幕分辨率】来进行分屏显示。如图(1)所示:     图(1) 右击桌面的...
  • sanqima
  • sanqima
  • 2015年08月16日 20:46
  • 4999

Winform/WPF 开发分屏显示应用程序

转自:http://blog.csdn.net/soft2buy/article/details/7082668 分屏显示即可把一台主机内运行的多个程序分别显示在不同的两个(或多个)屏幕上。目前市面上...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PreferenceActivity 分屏显示 分析
举报原因:
原因补充:

(最多只允许输入30个字)