私のアプリの一部として、ユーザーには名前のリストが表示され、適切と思われるグループ化するように求められます。
(注、ListViewコードはAndroid Viewsチュートリアルから逐語的にコピーされました。私はまだ自分のニーズに合わせてカスタマイズしていません。この作業を行う方法を見つけようとしています。)
基本的なレイアウトは、RelativeLayoutを含むScrollView(以下のコードでは「groupsScrollView」と呼ばれます)を含むLinearLayoutです。ボタンとテキストがいくつかあり、その下にリストビューがあり、名前のリストが表示されます。これはすべて表示画面領域よりも高いため、ユーザーはすべてを見るために垂直にスクロールできます。
これはすべて、ページが読み込まれるとき、リストビューの上部(ページの中央)に常に事前スクロールされることを除いて、すべて正常に機能します。ユーザーに何をすべきかを伝えるために作成したテキストとボタンは表示されません。
画面をつかんで上にスクロールすることもできますが、それはうまく機能しますが、画面が既に一番上までスクロールされた状態でロードしたいのです。ユーザーは、新しくロードされたページの上部を見るために上にスクロールする必要はありません。しかし、プログラムで画面の一番上までスクロールしようとしたすべてが失敗しました。
これが私のonCreateメソッドです:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.groups);
mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);
//get the Bundle out of the Intent...
Bundle extras = getIntent().getExtras();
mNames = extras.getStringArray("mNames");
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
//This is the line I'm having issues with
mainScrollView.pageScroll(View.FOCUS_UP);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
Toast.LENGTH_SHORT).show();
}
});
}
「mainScrollView.pageScroll(View.FOCUS_UP);」という行が問題です。エラーは発生しませんが、何もしないようです。scrollTo(0,0)、scrollDirection(View.FOCUS_UPを試しました。 )、および私が考えることができる他のすべて。
エラーが発生しないため、これらのスクロールコマンドが実際に機能していると仮定する必要がありますが、スクロールビューまたはそれを含むRelativeLayoutの上部ではなく、リストビューの上部にスクロールしていると仮定する必要があります。これはscrollTo(int x、int y)メソッドのGoogle自身の説明で確認されているようで、「このバージョンはスクロールを子供の境界に固定します」と言っています。
長い質問をさらに長くするために、ScrollViewに含まれる画面に多数のビューを読み込み、ユーザーが操作できるようにプログラムでページ全体をスクロールする方法を教えてください。
ありがとう!
試してみる
mainScrollView.fullScroll(ScrollView.FOCUS_UP);
動作するはずです。
同じ問題、おそらく何らかのバグがありました。
他の回答のfullScroll(ScrollView.FOCUS_UP)
でも機能しませんでした。
ダイアログが表示された直後に、私のために働いたのはscroll_view.smoothScrollTo(0,0)
を呼び出すことだけでした。
私は同じ問題を抱えていたので、修正しました。お役に立てば幸いです。
listView.setFocusable(false);
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
これは正常に機能しますが、この行の問題は、データがscrollViewObjectに入力されるとすぐに呼び出されることです。データが入力されるまで数ミリ秒待機する必要があります。このコードを試してください:
scrollViewObject.postDelayed(new Runnable() {
@Override
public void run() {
scroll.fullScroll(ScrollView.FOCUS_UP);
}
}, 600);
OR
scrollViewObject.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
scrollViewObject.getViewTreeObserver().removeOnGlobalLayoutListener(this);
scrollViewObject.fullScroll(View.FOCUS_UP);
}
});
これらすべての有効なソリューションの主な問題は、まだ画面に描画されていないスクロールを上に移動しようとしていることです。
スクロールビューが画面に表示されるまで待ってから、これらのソリューションのいずれかで上に移動する必要があります。遅延を気にしないので、これは後遅延よりも優れたソリューションです。
// Wait until my scrollView is ready
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Ready, move up
scrollView.fullScroll(View.FOCUS_UP);
}
});
ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll);
scroll.setFocusableInTouchMode(true);
scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
View FlipperまたはDialog内でScrollviewを使用しているときに、scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
がfalseを返すので、scrollViewObject.smoothScrollTo(0, 0)
が機能しているという同じ問題に直面しました
final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview);
scrollview.post(new Runnable() {
public void run() {
scrollview.scrollTo(0, 0);
}
});
runOnUiThread( new Runnable(){
@Override
public void run(){
mainScrollView.fullScroll(ScrollView.FOCUS_UP);
}
}
これはscrollviewの強制スクロールです:
scrollView.post(new Runnable() {
@Override
public void run() {
scrollView.scrollTo(0, 0);
scrollView.pageScroll(View.FOCUS_UP);
scrollView.smoothScrollTo(0,0);
}
});
これは私のために働いています
scroll_view.smoothScrollTo(0,0); // scroll to top of screen
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Ready, move up
scrollView.fullScroll(View.FOCUS_UP);
}
});
@SuppressWarnings({ "deprecation", "unchecked" })
public void swipeTopToBottom(AppiumDriver<MobileElement> driver)
throws InterruptedException {
Dimension dimensions = driver.manage().window().getSize();
Double screenHeightStart = dimensions.getHeight() * 0.30;
int scrollStart = screenHeightStart.intValue();
System.out.println("s="+scrollStart);
Double screenHeightEnd = dimensions.getHeight()*0.90;
int scrollEnd = screenHeightEnd.intValue();
driver.swipe(0,scrollStart,0,scrollEnd,2000);
CommonUtils.threadWait(driver, 3000);
}