Это фактическая деталь реализации CollapsingToolbarLayout
, как показано в исходном коде :
if (Math.abs(verticalOffset) == scrollRange) {
// If we have some pinned children, and we're offset to only show those views,
// we want to be elevate
ViewCompat.setElevation(layout, layout.getTargetElevation());
} else {
// Otherwise, we're inline with the content
ViewCompat.setElevation(layout, 0f);
}
Который удаляет высоту, когда CollapsingToolbarLayout
показывает, -pinned elements - по умолчанию он будет иметь только высоту, когда видны только закрепленные дети.
Я думаю, что существует 3 опции для передачи строки
class Test
{
public static void Main()
{
string test = "before passing";
Console.WriteLine(test);
TestI(ref test);
Console.WriteLine(test);
}
public static void TestI(ref string test)
{
test = "after passing";
}
}
public static void Main()
{
DATA.Str = "before passing";
Console.WriteLine(DATA.Str);
TestI("after passing");
Console.WriteLine(DATA.Str);
}
public class DATA
{
public static string Str { get; set; } = "";
}
public static void TestI(string text)
{
DATA.Str = text;
}
class Test
{
public static void Main()
{
Thread.SetData(Thread.GetNamedDataSlot("memory"), "before passing");
var n = Thread.GetData(Thread.GetNamedDataSlot("memory"));
Console.WriteLine(n);
TestI("after passing");
n = Thread.GetData(Thread.GetNamedDataSlot("memory"));
Console.WriteLine(n);
}
public static void TestI(string text)
{
Thread.SetData(Thread.GetNamedDataSlot("memory"), text);
}
}
Попробуйте:
public static void TestI(ref string test)
{
test = "after passing";
}
На самом деле это было бы одинаково для любого объекта в этом отношении, то есть быть ссылочным типом и передавать по ссылке - это две разные вещи в C #.
Это будет работать, но это применимо независимо от типа:
public static void TestI(ref string test)
Также о том, что строка является ссылочным типом, это тоже особый тип. Он разработан, чтобы быть неизменным, поэтому все его методы не будут изменять экземпляр (они возвращают новый). В нем также есть кое-что для повышения производительности.
Ссылка на строку передается по значению. Есть большая разница между передачей ссылки по значению и передачей объекта по ссылке. К сожалению, слово «ссылка» используется в обоих случаях.
Если вы сделаете передадите строковую ссылку по ссылке, она будет работать так, как вы ожидаете:
using System;
class Test
{
public static void Main()
{
string test = "before passing";
Console.WriteLine(test);
TestI(ref test);
Console.WriteLine(test);
}
public static void TestI(ref string test)
{
test = "after passing";
}
}
Теперь вам нужно различать внесение изменений в объект, на который ссылается ссылка, и внесение изменений в переменную (например, параметр), чтобы она могла ссылаться на другой объект. Мы не можем вносить изменения в строку, потому что строки неизменяемы, но мы можем продемонстрировать это с помощью StringBuilder
вместо этого:
using System;
using System.Text;
class Test
{
public static void Main()
{
StringBuilder test = new StringBuilder();
Console.WriteLine(test);
TestI(test);
Console.WriteLine(test);
}
public static void TestI(StringBuilder test)
{
// Note that we're not changing the value
// of the "test" parameter - we're changing
// the data in the object it's referring to
test.Append("changing");
}
}
Подробнее см. в моей статье о передаче параметров .