У меня возникла аналогичная проблема. Чтобы решить эту проблему, выполните простую работу:
В вашем onCreateView вам придется подождать до создания представления. Поэтому измените свои строки следующим образом:
mList = (ListView)v.findViewById(R.id.list);
mList.setAdapter(adapter);
ИЗМЕНИТЬ ВЫШЕ ДВУХ ЛИНИЙ В:
mList = (ListView)v.findViewById(R.id.list);
mList.post(new Runnable() {
public void run() {
mList.setAdapter(adapter);
}
});
Надеюсь, это поможет другим, столкнувшимся с подобной проблемой
Я не знаю, является ли это корректное использование, но я думаю, что можно вызвать перезагрузку файла CSS с помощью строки запроса:
<link href="mystyle.css?SOME_UNIQUE_TEXT" type="text/css" rel="stylesheet" />
Я помню, что использовал этот метод несколько лет назад для принуждения перезагрузки изображения веб-камеры, но время, вероятно, шло дальше...
Не используя js, можно просто сохранить имя файла CSS в переменной сеанса. Когда запрос выполнен к Основной Странице, Вы просто составляете тег link CSS с именем переменной сеанса.
Будучи ccs отличающимся именем файла, Вы вынуждаете broswer загрузить его, не будучи должен проверить то, что было ранее загружено в браузере.
Поскольку jeroen предположил, что у Вас может быть что-то как:
<link href="StyleSelector.aspx?foo=bar&baz=foz" type="text/css" rel="stylesheet" />
Затем Ваш файл StyleSelector.aspx должен быть чем-то вроде этого:
<%@ Page Language="cs" AutoEventWireup="false" Inherits="Demo.StyleSelector" Codebehind="StyleSelector.aspx.cs" %>
И Ваш StyleSelector.aspx.cs как это:
using System.IO;
namespace Demo
{
public partial class StyleSelector : System.Web.UI.Page
{
public StyleSelector()
{
Me.Load += New EventHandler(doLoad);
}
protected void doLoad(object sender, System.EventArgs e)
{
// Make sure you add this line
Response.ContentType = "text/css";
string cssFileName = Request.QueryString("foo");
// I'm assuming you have your CSS in a css/ folder
Response.WriteFile("css/" + cssFileName + ".css");
}
}
}
Это отправило бы пользователю содержание файла CSS (на самом деле любой файл, см. примечание по безопасности:) на основе аргументов строки запроса. Теперь хитрая часть делает, Условное выражение ДОБИРАЮТСЯ, который является необычным названием проверки, если у пользователя есть страница в кэше или нет.
В первую очередь, я настоятельно рекомендую, чтобы Вы читающий Условное выражение HTTP ДОБРАЛИСЬ для хакеров RSS, большая статья, которая объясняет, основы Условного выражения HTTP ПОЛУЧАЮТ механизм. Это - необходимость чтение, верьте мне.
Я отправил подобный ответ (но с кодом PHP, извините) к, ТАКИМ ОБРАЗОМ, вопрос может я использовать “http заголовок”, чтобы проверить, была ли динамическая страница изменена. Должно быть легко портировать код от PHP до C# (я сделаю это, если позже у меня будет время.)
Примечание по безопасности:: это - очень небезопасное выполнение чего-то как ("CSS /" + cssFileName + ".css"), поскольку можно отправить строку относительного пути, и таким образом можно отправить пользователю содержание другого файла. Необходимо придумать лучший способ узнать что файл CSS отправить.
Примечание дизайна: вместо .aspx страницы Вы могли бы хотеть использовать IHttpModule
или IHttpHandler
, но этот путь работает просто великолепно.
Необходимо возможно просто совместно использовать класс общего предка, затем можно щелкнуть им с единственной командой js в случае необходимости.
<body class="style2">
<body class="style1">
и т.д.
Ответ для вопроса 1
Вы могли записать Управление сервером, наследовавшееся Системе. Сеть. UI.Control переопределение Метода рендеринга:
public class CSSLink : System.Web.UI.Control
{
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
if ( ... querystring params == ... )
writer.WriteLine("<link href=\"/styles/css1.css\" type=\"text/css\" rel=\"stylesheet\" />")
else
writer.WriteLine("<link href=\"/styles/css2.css\" type=\"text/css\" rel=\"stylesheet\" />")
}
}
и вставьте экземпляр этого класса в Вашем MasterPage:
<%@ Register TagPrefix="mycontrols" Namespace="MyNamespace" Assembly="MyAssembly" %>
...
<head runat="server">
...
<mycontrols:CSSLink id="masterCSSLink" runat="server" />
</head>
...
Я знаю, что вопрос был конкретно о C#, и я принимаю от того Windows Server некоторого аромата. Так как я не знаю ни одну из тех технологий хорошо, я дам ответ, это будет работать в PHP и Apache, и можно получить что-то от него.
Как предложено ранее, просто установите идентификатор или класс на теле страницы, зависящей от определенного запроса, например, (в PHP)
<?php
if($_GET['admin_page']) {
$body_id = 'admin';
} else {
$body_id = 'normal';
}
?>
...
<body id="<?php echo $body_id; ?>">
...
</body>
И Ваш CSS может предназначаться для этого:
body#admin h1 {
color: red;
}
body#normal h1 {
color: blue;
}
и т.д.
Что касается принуждения загрузки CSS, Вы могли сделать это в Apache с mod_expires или mod_headers модулями - для mod_headers, это в .htaccess остановит кэшируемые файлы CSS:
<FilesMatch "\.(css)$">
Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate"
</FilesMatch>
Но так как Вы, вероятно, не используете апача, который не поможет Вам очень :(
Мне нравится предложение Джероена добавить строку запроса к URL таблицы стилей. Можно добавить метку времени, когда файл таблицы стилей был изменен в последний раз. Мне кажется, это хороший кандидат для вспомогательной функции или пользовательского элемента управления, который будет генерировать тег LINK для вас.