私の問題は解決するのは難しいとは思っていませんが、しばらく検索しています。LibGDX scene2dでは、選択ボックスの項目を変更した後、デフォルトのリスナーがなくなりました
私は2つのscene2d SelectBox
ウィジェットをテーブルの上にステージ上に重ねて配置しています。それらをAとBとしましょう。Aで選択されているものはBに表示されるリストを決定します。これはAにChangeListener
を使用して実装し、すべて正常に動作します(これは問題ではありません)。
しかし、私のリストAは非常に長くなっていたので(500以上のアイテム)、これよりもTextField
を追加して、文字列を検索して一致させたい場合は、古いリストを短いものに置き換えて、あなたが探しているものを見つける。これは正常に動作しますが、テキストフィールドにChangeListener
を使用して文字列を取得し、forループを使用して文字列のメインリストと比較し、SelectBox
に調整済みの文字列を追加するためにaList.setItems();
を使用します。リストは表示されます(クリックなしで、私はTextField
のChangeListener
にaList.showList();
を使用しています)、これはどこかで問題が発生する場所だと思います - クリックの代わりにshowList()
が他の場所から呼び出されます。私は自分の考えを変え、Aから別のアイテムを選択したいと言うと、もはやクリック時にメニューをドロップしなくなります。しかし、検索バーにあるテキストを変更すると、リストが表示されます。リストが表示されているときは、アイテムをクリックすると通常どおりに非表示になります。
これかもしれないので、ここで、少し混乱と思われるコードです(わかりやすくするために編集するので、何かが欠落している場合、私に知らせて)選択ボックスがクリックされた場合
SelectBox aSelect, bSelect;
TextField searchBar;
Stage stage;
Table table;
Skin skin;
ArrayList<String> completeAList;
ArrayList<String> abrevAList;
public chooseItemScreen()
{
stage = new Stage(new ScreenViewport());
skin = new Skin(Gdx.files.internal("uiskin.json"));
table = new Table();
table.setFillparent(true);
completeAList = new ArrayList<String>;
abrevAList = new ArrayList<String>;
aSelect = new SelectBox(skin);
//ItemList is a class with the list of strings as a static method
completeAList = ItemList.getAList();
aSelect.setItems(completeAList.toArray());
//bSelect omitted as is same as A
//aSelect changeListener also omitted as it is working fine
searchBar = new TextField("", skin);
searchBar.setMessageText("SEARCH LIST");
searchPokemon.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
updateASelect();
}
});
table.add(searchBar);
table.row();
table.add(aList);
stage.addActor(table);
Gdx.input.setInputProcessor(stage);
}
private void updateAList()
{
abrevAList.clear();
aSelect.clearItems();
aSelect.hideList()
for (String string: completeAList)
{
if (string.toLowerCase().startsWith(searchBar.getText().toLowerCase()))
{
abrevAList.add(string);
}
}
if (abrevAList.isEmpty())
{
abrevAList.add("NOT FOUND");
}
aSelect.setItems(abrevAList.toArray());
//It's at this point where I am no longer to click on aSelect
//I can still select an item from the drop down list, closing the list
//it's just I can't show list by clicking on the widget after that
aSelect.showList();
}
@Override
public void render(float delta) {
Gdx.gl20.glClearColor(0,0,0,0);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act();
stage.draw();
}
は、私が言うには、次のリスナーを追加しました(これはそれだった)。私はすべての俳優の名前を与えた
stage.getRoot().addCaptureListener(new InputListener() {
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
System.out.println(event.getTarget().getName());
return false;
}
});
クリックは認識され、リストは表示されません。私の意見では、それはshowList()
を呼び出すと同時にリストを変更することで問題になります。
何か助けていただきありがとうございます、より多くのコードやその他の情報が必要な場合はお知らせください。
おかげ
問題を引き起こしていたのはclearItemsの部分だと思っていましたが、私はリストを更新する前にクリアする必要があると仮定しました。私はそれを削除し、すべてうまく動作し、私はすでにコードを含めることを忘れて幅があった。ご協力ありがとうございました。libgdxのArrayクラスに関するヒントもありがとうございました。 – EssEllDee
嬉しいことに、libGDXは巨大なフレームワークです。私はこれを約4年間使用していますが、まだ学習することがたくさんあります –