ab1*_*b11 10 android preferences
我希望能够从我的PreferenceActivity中启动第二个Preference屏幕.在第二个首选项屏幕中,我想使用xml中的预定义布局.所以,我有两个问题:
如何使用xml布局作为首选项的布局视图?如何将此自定义首选项添加到PreferenceActivity,以便在轻触时启动?
谢谢
*编辑以回应不在犯罪现场
我试图通过声明要在xml中启动的活动,从首选项屏幕启动活动.这会导致此异常:
04-01 19:04:37.962: ERROR/AndroidRuntime(8061): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.me/CustomPrefScreen}; have you declared this activity in your AndroidManifest.xml?
Run Code Online (Sandbox Code Playgroud)
*另一个更新.但是,如果我使用Preference的某些扩展名替换了settings.xml中的PrefrenceScreen,它会覆盖onClick()以启动CustomPrefScreen,那么一切正常.
主要偏好活动:
public class MyPreferences extends PreferenceActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
}
Run Code Online (Sandbox Code Playgroud)
的settings.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
android:summary="my summary"
android:title="my title">
<intent android:action="android.intent.action.MAIN"
android:targetPackage="com.me"
android:targetClass="CustomPrefScreen"/>
</PreferenceScreen>
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
mainfest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.me"
android:versionCode="1"
android:versionName="1.0">
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/Theme.NoBackground">
<activity
android:name=".MyApp"
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=".CustomPrefScreen"
android:label="@string/app_name">
</activity>
<activity
android:name=".MyPreferences"
android:label="@string/app_name">
</activity>
</application>
<uses-sdk android:minSdkVersion="4" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
Run Code Online (Sandbox Code Playgroud)
slu*_*und 18
一种解决方案是扩展DialogPreference,允许为首选项对话框设置自定义布局.这样您就会列出首选项,当您点按它时,您会看到一个包含自定义设置UI的对话框.
<com.xyz.MyPreference
android:dialogLayout="@layout/yourlayout"
android:dialogTitle="Dialog Title"
android:dialogMessage="Dialog summary"
android:key="preference_key"
android:title="Preference Title"
android:summary="Preference summary"
android:defaultValue="Default Value" />
Run Code Online (Sandbox Code Playgroud)
和班级
class MyPreference extends DialogPreference {
// along with constructors, you will want to override
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
// view is your layout expanded and added to the dialog
// find and hang on to your views here, add click listeners etc
// basically things you would do in onCreate
mTextView = (TextView)view.findViewById(R.Id.mytextview);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
// deal with persisting your values here
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然还有其他一些细节,但这是基本的想法.
小智 7
不在场证明的解决方案-一个内限定的意图<PreferenceScreen>入口-工作对我来说,之后的多次试验和错误targetPackage和targetClass领域.
targetPackage需要是我的应用程序的包名称的完整路径(即package=AndroidManifest.xml文件中的条目).targetClass需要是活动的完整路径 - 包含包名称,即使活动与应用程序位于同一个包中.
应用程序的AndroidManifest.xml文件(当然)也需要Activity的条目.我没有<intent-filter>为此条目定义一个,大概是因为actionis MAIN(无论Activity是在与Application相同还是不同的包中都是如此).
示例:Application的包是com.thissocialworld.我想从PreferencesScreen一个名为com.coolcommonActivity的类开始的Activity和Activity类com.thissocialworld.SpecialPreferences.<PreferenceScreen>看起来像这样的条目:
<intent android:action="android.intent.action.MAIN"
android:targetPackage="com.thissocialworld"
android:targetClass="com.thissocialworld.SpecialPreferences"/>
Run Code Online (Sandbox Code Playgroud)
我可能会尝试改变action.MAIN,以action.PREFERENCES若有似有必要获得访问PreferencesManager.
(PS我在这里的第一篇文章,我无法弄清楚如何发布这个作为对alibi开始的讨论的评论.)
您可能需要类似于我从库或相机上传照片的操作.
package com.atClass.lmt;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.provider.MediaStore;
import android.util.Log;
public class Prefs extends PreferenceActivity{
//public static final int FLAG_ACTIVITY_CLEAR_TOP = 1;
private static final int MEDIA_IMAGE_REQUEST_CODE = 1;
private static final int CAMERA_IMAGE_REQUEST_CODE = 2;
public static Uri cImageUri;
public static Context cContext;
public static Activity cActivity;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
this.cContext = (Context)this;
this.cActivity = (Activity)this;
Preference customPref = (Preference) findPreference("user_display_picture");
customPref.setOnPreferenceClickListener(
new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
return imageUploadDialog();
}
});
}
protected void onStop(){
super.onStop();
MapTools.createMapView(false);
Lmt.serviceBinder.serviceThread("loginDevice");
}
public boolean imageUploadDialog(){
final CharSequence[] items = {"Take picture now","Upload from gallery"};
AlertDialog.Builder lAlertDialog = new AlertDialog.Builder(cContext);
lAlertDialog.setTitle("Upload action");
lAlertDialog.setCancelable(true);
lAlertDialog.setItems(items,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogInterface, int i){
//Toast.makeText(getApplicationContext(), "Selected item: " +i, Toast.LENGTH_SHORT).show();
if (i == 0){
attachCameraImage();
}
if (i == 1){
attachGalleryImage();
}
}
});
lAlertDialog.setIcon(R.drawable.click_to_url);
lAlertDialog.show();
return true;
}
public void attachGalleryImage(){
Intent getImageFromGalleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
startActivityForResult(getImageFromGalleryIntent, MEDIA_IMAGE_REQUEST_CODE);
}
public void attachCameraImage(){
String fileName = "testphoto.jpg";
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
values.put(MediaStore.Images.Media.DESCRIPTION,"Image capture by camera");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
cImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, cImageUri);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(intent, CAMERA_IMAGE_REQUEST_CODE);
}
protected final void onActivityResult(final int requestCode, final int resultCode, final Intent i) {
Log.d(Global.TAG,"--> Received callback with:" + resultCode);
super.onActivityResult(requestCode, resultCode, i);
if(resultCode == RESULT_OK) {
Log.d(Global.TAG,"--> Result OK with:" + requestCode);
switch(requestCode) {
case MEDIA_IMAGE_REQUEST_CODE:
Log.d(Global.TAG,"--> MEDIA_IMAGE_REQUEST_CODE");
Gui.GuiProgressDialog.showLoadingSpinner(cActivity);
cImageUri = i.getData();
if (cImageUri == null){Log.d(Global.TAG,"--> ImageURI is null!");}
Lmt.serviceBinder.serviceThread("uploadMemberPicture");
break;
case CAMERA_IMAGE_REQUEST_CODE:
Log.d(Global.TAG,"--> CAMERA_IMAGE_REQUEST_CODE");
//cImageUri = i.getData();
if (cImageUri == null){Log.d(Global.TAG,"--> ImageURI is null!");}
Lmt.serviceBinder.serviceThread("uploadMemberPicture");
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21388 次 |
| 最近记录: |