Я считаю, что CoordinatorLayout
(может быть, AppBarLayout
или CollapsingToolbarLayout
- не уверен, какой компонент) записывает неправильную высоту CollapsingToolbarLayout
из-за липкой панели инструментов. Поведение отличается, если элементы добавляются до или после исходного макета.
Попробуйте следующее:
android:layout_marginBottom="72dp"
из XML для RecyclerView
. android:minHeight="72dp"
в XML для CollapsingToolbarLayout
Поскольку ваша липкая панель инструментов установлена на 72dp
, можно использовать minHeight
с установленным на 72dp
.
]
Если у вас возникли проблемы с этим, отправьте сообщение сюда.
Вот краткая демонстрация вашего макета с использованием NestedScrollView
и изменений, упомянутых выше.
Обновление: Я решил это, используя RecyclerView
, который отображает ту же проблему. Демонстрационный проект, показывающий проблему и исправление, находится на GitHub .
Вот код:
MainActivity.java
public class MainActivity extends AppCompatActivity {
// Set to true to break the layout; false for it to work.
// The setting of this flag should only matter for the
// layout activity_not_working.
private boolean mBreakIt = true;
// private int mLayoutToUse = R.layout.activity_not_working;
private int mLayoutToUse = R.layout.activity_working;
private LinearLayout mLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(mLayoutToUse);
mLayout = findViewById(R.id.linearLayout);
if (mBreakIt) {
mLayout.post(new Runnable() {
@Override
public void run() {
addViews();
}
});
} else {
addViews();
}
}
private void addViews() {
for (int i = 0; i < 50; i++) {
TextView tv = new TextView(MainActivity.this);
tv.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
tv.setText("TextView #" + (i + 1));
mLayout.addView(tv);
}
}
}
Activity_working.xml
Activity_not_working.xml
Я сделал это один раз, надеюсь, это поможет:
bool createdNew;
Mutex m = new Mutex(true, "myApp", out createdNew);
if (!createdNew)
{
// myApp is already running...
MessageBox.Show("myApp is already running!", "Multiple Instances");
return;
}
Посмотрите этот вопрос
Есть ссылка на эту статью: неправильно понятый мьютекс , где объясняется использование мьютекса.
Посмотрите пример кода, показанный на этой странице
Короче говоря, вы используете перегрузку Mutex ctor (bool, string, out bool)
, которая сообщает через выходной параметр, получили ли вы право собственности на Named Mutex. Если вы первый экземпляр, этот параметр out будет содержать true после вызова ctor - в этом случае вы продолжите как обычно. Если этот параметр имеет значение false, это означает, что другой экземпляр уже получил право собственности / работает, и в этом случае отображается сообщение об ошибке «Другой экземпляр уже запущен». а затем выйдите изящно.
static void Main()
{
using(Mutex mutex = new Mutex(false, @"Global\" + appGuid))
{
if(!mutex.WaitOne(0, false))
{
MessageBox.Show("Instance already running");
return;
}
GC.Collect();
Application.Run(new Form1());
}
}
Источник: http://odetocode.com/Blogs/scott/archive/2004/08/20/401.aspx