Выполните единственный экземпляр приложения с помощью Взаимного исключения

Я считаю, что CoordinatorLayout (может быть, AppBarLayout или CollapsingToolbarLayout - не уверен, какой компонент) записывает неправильную высоту CollapsingToolbarLayout из-за липкой панели инструментов. Поведение отличается, если элементы добавляются до или после исходного макета.

Попробуйте следующее:

  1. Удалите android:layout_marginBottom="72dp" из XML для RecyclerView.
  2. Добавьте android:minHeight="72dp" в XML для CollapsingToolbarLayout

Поскольку ваша липкая панель инструментов установлена ​​на 72dp, можно использовать minHeight с установленным на 72dp.

]

Если у вас возникли проблемы с этим, отправьте сообщение сюда.


Вот краткая демонстрация вашего макета с использованием NestedScrollView и изменений, упомянутых выше.

Обновление: Я решил это, используя RecyclerView, который отображает ту же проблему. Демонстрационный проект, показывающий проблему и исправление, находится на GitHub .

enter image description here

Вот код:

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



    

        

            

            
            

                

                    

                    

                

            

        

    

    
    
    

    

        

            

            

            

            


        
    


22
задан blitzkriegz 4 May 2009 в 11:55
поделиться

5 ответов

Я сделал это один раз, надеюсь, это поможет:

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;
}
14
ответ дан 29 November 2019 в 05:26
поделиться

Посмотрите этот вопрос

Есть ссылка на эту статью: неправильно понятый мьютекс , где объясняется использование мьютекса.

1
ответ дан 29 November 2019 в 05:26
поделиться

Посмотрите пример кода, показанный на этой странице

Короче говоря, вы используете перегрузку Mutex ctor (bool, string, out bool) , которая сообщает через выходной параметр, получили ли вы право собственности на Named Mutex. Если вы первый экземпляр, этот параметр out будет содержать true после вызова ctor - в этом случае вы продолжите как обычно. Если этот параметр имеет значение false, это означает, что другой экземпляр уже получил право собственности / работает, и в этом случае отображается сообщение об ошибке «Другой экземпляр уже запущен». а затем выйдите изящно.

1
ответ дан 29 November 2019 в 05:26
поделиться
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

7
ответ дан 29 November 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: