2015-10-24 4 views
1

Я пытаюсь переместить вид LinearLayout, изменив его поле, используя интерфейс и следующий код:Android. Изменение запаса LinearLayout во время выполнения

 @Override 
public void onListScroll(int offset) { 
     tabBarOffset += offset; 
     if (tabBarOffset < 0) tabBarOffset = 0; 
     if (tabBarOffset > 50) tabBarOffset = 50; 
     View tabBar = findViewById(R.id.movingTabBar); 
     ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) tabBar.getLayoutParams(); 
     params.topMargin = tabBarOffset; 
    } 

код работает с первым вызовом - когда активность создаются. Но всякий раз, когда кодовый блок вызывается после, никаких изменений в представлении не происходит. Я могу подтвердить, что параметр margin изменен, из-за трех фактов: 1) код работает при запуске 2) регистрация значения marginTop всегда дает новые значения (изменяется) 3) в представлении иерархии я мог видеть новое значение маржи

, так что я думаю, что мне просто нужно вызвать какой-то метод для обновления самого представления? чтобы перерисовать? или, может быть, мне нужно вызвать некоторый код в потоке пользовательского интерфейса? потому что этот код запускается из обратного вызова интерфейса.

ответ

2

попробовать это:

@Override 
public void onListScroll(final int offset) { 

    new Handler(Looper.getMainLooper()).post(new Runnable() { 
     @Override 
     public void run() { 
      tabBarOffset += offset; 
      if (tabBarOffset < 0) tabBarOffset = 0; 
      if (tabBarOffset > 50) tabBarOffset = 50; 
      ViewGroup tabBar = findViewById(R.id.movingTabBar); 
      ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) tabBar.getLayoutParams(); 
      params.topMargin = tabBarOffset; 
      tabBar.requestLayout(); 
     } 
    }); 

} 
+0

спасибо за попытку помочь. К сожалению, это не имеет никакого эффекта. –

+0

только ради интереса, пожалуйста, попробуйте отредактированный вариант –

+0

работ! так что тогда была проблема? работает на основной нити? –

Смежные вопросы