您的位置:首页 > 其它

是ActivityGroup 的BUG?是对机制理解不深刻?还是逻辑错误?还是。。。不知道了? 推荐

2010-09-27 11:03 531 查看
首先,先喷一下张艺谋的片子,你他妈太黑了~!什么史上最干净的爱情片,我说是史上最烂的爱情片,只能把无知当纯情。拍电影拍得一点诚意都没有,只会抄韩国的爱情片,记得有一部韩国片跟你这部剧情都差不多~!你就使劲抄吧~!!浪费我160大洋,进去睡觉。

喷到这里。

这一两天碰到一个问题,是一个关于ActivityGroup 的问题,因为项目需要,必须把一个自定义的PreferenceActivity 的界面嵌套在ActivityGroup 里面,可是当我嵌套在里面的时候发现了一个问题。就是PreferenceActivity 的元素不会自动更新UI,这是比较致命的,不知道为什么会出现这个问题。

查了很久,首先我怀疑是我的自定义preference写的有问题,改了一遍,然后再运行还是一样。

单独运行该 preferenceActivity 试了一下,界面可以按照自己的需求更新UI,那就是说不是我这个自定义的preference 的逻辑问题?这点还不敢确定。

那么我怀疑是 ActivityGroup 不允许底下Activity 元素的UI自动更新,那么新建一个普通的Activity 来试试,在这普通的Activity 里面只有一个按钮同样是点击之后弹出对话框然后改变按钮的字,试了一下,。更新成功。。。耶?那么说ActivityGroup 还是允许底下Activity UI 元素更新的?那么问题出在哪呢?

我又再调试跟踪了代码,确定有执行settext的代码?那是不是说preferenceActivity 和ActivityGroup有冲突?不知道所然,下面贴出我碰到问题的全部代码,由于在公司有加密软件无法将DEMO提供给大家,大家可以根据代码新建一个工程,一起来研究这个问题。

自定义的PreferenceScreenExt 源码:

package asai.cn.seekbardemo;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import android.app.Dialog;

import android.content.Context;

import android.content.DialogInterface;

import android.content.SharedPreferences;

import android.preference.Preference;

import android.preference.PreferenceGroup;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.view.View.OnClickListener;

import android.widget.AdapterView;

import android.widget.ListView;

import android.widget.RelativeLayout;

import android.widget.SimpleAdapter;

import android.widget.TextView;

import android.widget.AdapterView.OnItemClickListener;

public class PreferenceScreenExt extends PreferenceGroup implements

OnItemClickListener, DialogInterface.OnDismissListener {

private Dialog dialog;

private TextView title, summary;

private SharedPreferences share;

private RelativeLayout area;

private ListView listView;

List<Preference> list;

private List<HashMap<String, String>> listStr;

private CharSequence[] mEntries;

private String mValue;

private SimpleAdapter simple;

public PreferenceScreenExt(Context context, AttributeSet attrs) {

this(context, attrs, android.R.attr.preferenceScreenStyle);

// TODO Auto-generated constructor stub

}

public PreferenceScreenExt(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, android.R.attr.preferenceScreenStyle);

// TODO Auto-generated constructor stub

int resouceId = attrs.getAttributeResourceValue(null, "Entries", 0);

if (resouceId > 0) {

mEntries = getContext().getResources().getTextArray(resouceId);

}

}

@Override

protected View onCreateView(ViewGroup parent) {

// TODO Auto-generated method stu

View view = LayoutInflater.from(getContext()).inflate(

R.layout.preference_screen, null);

area = (RelativeLayout) view.findViewById(R.id.area);

share = getPreferenceManager().getSharedPreferences();

title = (TextView) view.findViewById(R.id.title);

summary = (TextView) view.findViewById(R.id.summary);

title.setText(getTitle());

summary.setText(share.getString(getKey(), getSummary() == null ? ""

: getSummary().toString()));

area.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

showDialog();

}

});

return view;

}

public void bindView(ListView listview) {

int length = mEntries.length;

int i = 0;

listStr = new ArrayList<HashMap<String, String>>();

for (i = 0; i < length; i++) {

HashMap<String, String> map = new HashMap<String, String>();

map.put("keyname", mEntries[i].toString());

listStr.add(map);

}

simple = new SimpleAdapter(getContext(), listStr, R.layout.dialog_view,

new String[] { "keyname" }, new int[] { R.id.text });

listview.setAdapter(simple);

listview.setOnItemClickListener(this);

}

public void showDialog() {

listView = new ListView(getContext());

bindView(listView);

dialog = new Dialog(getContext(), android.R.style.Theme_NoTitleBar);

dialog.setContentView(listView);

dialog.setOnDismissListener(this);

dialog.show();

}

@Override

public void onItemClick(AdapterView<?> parent, View view, int position,

long id) {

// TODO Auto-generated method stub

mValue = listStr.get(position).get("keyname").toString();

SharedPreferences.Editor editor = getEditor();

editor.putString(getKey(), mValue);

callChangeListener(mValue);

PreferenceScreenExt.this

.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

@Override

public boolean onPreferenceChange(Preference preference,

Object newValue) {

// TODO Auto-generated method stub

if (temp != null) {

temp.onPreferenceChange(PreferenceScreenExt.this,

newValue);

}

return true;

}

});

editor.commit();

dialog.dismiss();

}

@Override

public void onDismiss(DialogInterface dialog) {

// TODO Auto-generated method stub

}

private OnPreferenceChangeListener temp;

public interface OnPreferenceChangeListener {

public boolean onPreferenceChange(Preference preference, Object newValue);

}

public void setOnPreferenceChangeListener(

OnPreferenceChangeListener preference) {

this.temp = preference;

}

public void setValue(String value) {

summary.setText(value);

persistString(value);

}

}

对应的XML布局文件:




dialog_view.xml

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

<LinearLayout android:layout_width="fill_parent"

xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical" android:gravity="center"

android:layout_height="fill_parent" >

<TextView android:id="@+id/text" android:layout_marginLeft="20dp"

android:textAppearance="?android:attr/textAppearanceLarge"

android:textSize="35sp" android:layout_width="wrap_content"

android:layout_height="wrap_content">

</TextView>

</LinearLayout>




preference_screen.xml

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

<RelativeLayout android:id="@+id/area" android:gravity="center_vertical"

android:layout_marginTop="5px" android:clickable="true"

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

<TextView android:id="@+id/title" android:layout_marginLeft="20dp"

android:textAppearance="?android:attr/textAppearanceLarge"

android:textSize="35sp" android:layout_width="wrap_content"

android:layout_height="wrap_content">

</TextView>

<TextView android:id="@+id/summary"

android:layout_marginRight="20dp" android:textSize="35sp"

android:textAppearance="?android:attr/textAppearanceLarge"

android:layout_alignParentRight="true" android:layout_width="wrap_content"

android:layout_height="wrap_content">

</TextView>

</RelativeLayout>

XML文件夹下的XML文件:




preference.xml

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

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

<asai.cn.seekbardemo.PreferenceScreenExt

Entries="@array/country" android:title="收音区域" android:summary="美国"

android:persistent="true" android:key="eeg">

</asai.cn.seekbardemo.PreferenceScreenExt>

</PreferenceScreen>

main.java 对应代码

package asai.cn.seekbardemo;

import android.app.ActivityGroup;

import android.app.LocalActivityManager;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.Window;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.LinearLayout;

public class main extends ActivityGroup implements OnClickListener {

private LocalActivityManager lm;

private LinearLayout layout;

private Button btn, btn2;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.group);

lm = getLocalActivityManager();

btn = (Button) findViewById(R.id.Button01);

btn2 = (Button) findViewById(R.id.Button02);

btn.setOnClickListener(this);

btn2.setOnClickListener(this);

layout = (LinearLayout) findViewById(R.id.layout);

Intent intent = new Intent(this, seekBarDemo.class);

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Window w = lm.startActivity("test", intent);

View v = w.getDecorView();

layout.removeAllViews();

layout.addView(v);

}

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()) {

case R.id.Button01:

Intent intent = new Intent(this, seekBarDemo.class);

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Window w = lm.startActivity("test", intent);

View view = w.getDecorView();

layout.removeAllViews();

layout.addView(view);

break;

case R.id.Button02:

Intent in = new Intent(this, test.class);

in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Window win = lm.startActivity("ww", in);

View vw = win.getDecorView();

layout.removeAllViews();

layout.addView(vw);

break;

default:

break;

}

}

}

对应的XML布局文件:




group.xml

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

<LinearLayout android:orientation="vertical"

android:layout_width="fill_parent" android:layout_height="fill_parent"

xmlns:android="http://schemas.android.com/apk/res/android">

<LinearLayout android:layout_width="fill_parent"

android:gravity="center_horizontal" android:layout_height="wrap_content">

<Button android:text="preference界面" android:id="@+id/Button01"

android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

<Button android:text="普通" android:id="@+id/Button02"

android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

</LinearLayout>

<LinearLayout android:id="@+id/layout"

android:layout_width="fill_parent" android:layout_height="wrap_content"></LinearLayout>

</LinearLayout>

PreferenceActivity 界面代码 SeekBarDemo.java:

package asai.cn.seekbardemo;

import android.os.Bundle;

import android.preference.Preference;

import android.preference.PreferenceActivity;

import android.preference.Preference.OnPreferenceChangeListener;

import android.widget.TextView;

public class seekBarDemo extends PreferenceActivity {

private Preference eeg;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preference);

final PreferenceScreenExt pre = (PreferenceScreenExt) findPreference("eeg");

pre.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

@Override

public boolean onPreferenceChange(Preference preference,

Object newValue) {

// TODO Auto-generated method stub

pre.setValue(String.valueOf(newValue));

return true;

}

});

}

}

普通的Activity 界面代码test.java:

package asai.cn.seekbardemo;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class test extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.test);

final Button btn = (Button) findViewById(R.id.Button01);

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

new AlertDialog.Builder(test.this).setMessage("修改").setTitle(

"提示").setPositiveButton(android.R.string.ok,

new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog,

int which) {

// TODO Auto-generated method stub

btn.setText("修改后的按钮");

}

}).show();

}

});

}

}

配置文件:




AndroidManifest.xml

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="asai.cn.seekbardemo" android:versionCode="1"

android:versionName="1.0">

<application android:icon="@drawable/icon" android:label="@string/app_name">

<activity android:name=".main" android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<activity android:name=".test" android:label="@string/app_name">

<intent-filter>

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<activity android:name=".seekBarDemo" android:label="@string/app_name">

<intent-filter>

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

<uses-sdk android:minSdkVersion="7" />

</manifest>

希望就此问题和大家探讨一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息