Вы всегда должны звонить super.onActivityResult()
в своей деятельности onActivityResult
. Это то, что отправляет onActivityResult
обратные вызовы к фрагментам, которые вызвали startActivityForResult
с правильными requestCodes - ваш метод отправки вручную не выполняет переотображение кода запроса:
// In your MainActivity.java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "OPENFILECHOOSER4");
super.onActivityResult(requestCode, resultCode, data);
}
Мне нравится использовать Settings
. Они могут быть сгенерированы автоматически или путем создания файла настроек с помощью диалогового окна Add New File, или путем добавления файла настроек по умолчанию от свойств проекта.
Каждая установка может быть в пользователе или области действия приложения, которая управляет, может ли пользователь изменить их, или они ограничиваются своими значениями по умолчанию. Они легко сохраняются с Save()
метод и загруженный автоматически в помехи Default
свойство.
Этот класс, кажется, для приложения или основанных на пользователе настроек. Я ищу науправляемый настройки. Вы все еще рекомендовали бы использовать этот класс в этом случае? – x97mdr
Да. Если у Вас есть и основанные на пользователе/приложении настройки и науправляемый настройки, необходимо использовать два различных класса - нормальные (сохраненные) настройки и науправляемый настройки.
Пока Вы не сохраняете науправляемый настройки, необходимо быть в безопасности, и настройки все еще довольно просты в использовании. Это статические настройки все же. Если тому же выполнению приложения нужны несколько экземпляров - это - неправильный подход.
Я использовал бы единственный объект конфигурации как следующее:
using System;
using System.IO;
using System.Reflection;
public sealed class Setting {
public static int FrameMax { get; set; }
public static string VideoDir { get; set; }
static readonly string SETTINGS = "Settings.ini";
static readonly Setting instance = new Setting();
Setting() {}
static Setting() {
string property = "";
string[] settings = File.ReadAllLines(SETTINGS);
foreach (string s in settings)
try {
string[] split = s.Split(new char[] { ':' }, 2);
if (split.Length != 2)
continue;
property = split[0].Trim();
string value = split[1].Trim();
PropertyInfo propInfo = instance.GetType().GetProperty(property);
switch (propInfo.PropertyType.Name) {
case "Int32":
propInfo.SetValue(null, Convert.ToInt32(value), null);
break;
case "String":
propInfo.SetValue(null, value, null);
break;
}
} catch {
throw new Exception("Invalid setting '" + property + "'");
}
}
}
Так как это - одиночный элемент, он создаст один и только один экземпляр себя в первый раз a public static
на свойство ссылаются от Setting
объект.
Когда объект создается, он читает из Settings.ini
файл. Файл настроек является файлом простого текста с простым key : value
структура, которая могла бы быть похожей на это:
FrameMax : 12
VideoDir : C:\Videos\Best
Объект использует отражение, чтобы обнаружить каждое свойство и сохранить его начальное значение. В этом примере были определены два свойства:
public static int FrameMax { get; set; }
public static string VideoDir { get; set; }
Код как записанные дескрипторы Int32
и String
типы. Путем добавления дополнительный case
операторы к switch
оператор, Вы могли легко добавить поддержку типов как Float
и Decimal
.
Для изменения настроек Вы использовали бы что-то как:
Setting.FrameMax = 5;
Для получения установки Вы использовали бы что-то как:
if (Setting.FrameMax > 10) ...
Вы заметите, что все свойства со строгим контролем типов. Кроме того, Вы не должны передавать Setting
объект вокруг, как весь Setting
свойства static
и всегда доступный везде.
Я надеюсь, что эта идея полезна.
XmlDocument - можно генерировать определение класса с помощью XSD.exe
Я нахожу, что каждый раз, когда я должен иметь дело с унаследованной системой, придерживающейся старого формата почти всегда, работает лучше всего. Часто времена там являются другими людьми, использующими унаследованные форматы для других задач (как автоматизация приложения, например), поэтому при перекодировании пути исходные данные дескрипторов приложения Вы могли бы повредить другие системы.
С другой стороны, если Вы довольно уверены, что знаете всех людей, использующих систему, и они говорят Вам, что не заботятся, изменяете ли Вы эти типы вещей, я, вероятно, переместил бы все в XML. Помимо всех хороших функций XML с точки зрения приложения (как то, чтобы быть в ASCII, таким образом, это легко изменяется людьми, будучи самодокументирующим, и т.д....), XML также экономит время, в этом Вы не должны писать свой собственный ввод-вывод или синтаксический анализатор. Уже существует большое разнообразие библиотек там, особенно в.NET 3.0/3.5, которые делают очень хорошо. (Когда Вы перемещаетесь в C#, я предполагаю, что Вы уже думаете вдоль этих строк :)
Так в конечном счете необходимо было бы основывать решение о стоимости для реализации: при понижении стоимости реализации путем перемещения в XML или подобный удостоверьтесь, что Вы не повышаете стоимость других людей реализации для перемещения в новую среду разработки приложения.
Удачи!