Я придумал способ, и он работает почти идеально.
У меня есть LinearLayout (llCommunicationsLayout) внутри ScrollView (svCommunications).
Я раздуваю новый LinearLayout, я собираюсь добавить представления в верхнюю часть этого нового LinearLayout, а затем добавить этот новый макет в LinearLayout внутри ScrollView.
Это новый макет:
final LinearLayout wrapperLayout = (LinearLayout) mInflater.inflate(R.layout.empty_layout, null);
Я добавляю свои представления в нулевую позицию этого макета.
wrapperLayout.addView(view, 0);
После того, как все представления добавлены в wrapperLayout, я добавляю wrapperLayout в llCommunicationsLayout (тот, который находится внутри моего ScrollView)
llCommunicationsLayout.addView(wrapperLayout, 0);
После этого я вычисляю их высоту после того, как wrapperLayout отображается на экране (имеет измеримую высоту).
wrapperLayout.post(new Runnable() {
@Override
public void run() {
int wrapperHeight = wrapperLayout.getHeight();
int svHeight = svCommunications.getHeight();
int scrollHeight = Math.abs(svHeight - wrapperHeight);
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int displayHeight = displaymetrics.heightPixels / 4;
svCommunications.scrollTo(0, (scrollHeight + displayHeight));
}
});
Здесь я получаю как только что добавленный макет, так и высоту ScrollView.
Я вычисляю их разницу, складываю 1/4 высоты экрана своего устройства и прокручиваю, вуаля!
Это не идеально, но после добавления макетов он больше не прокручивается в верхнюю часть экрана. Поэкспериментируйте с displayHeight для получения разных результатов.
Надеюсь, это кому-то поможет.
person
Lev
schedule
24.06.2014