gpt4 book ai didi

Android Spinner onItemSelected 未在 Fragment 内部调用

转载 作者:行者123 更新时间:2023-12-05 00:08:22 24 4
gpt4 key购买 nike

我有一个调用多个 fragment 的 Activity 。在其中一个 fragment 中,我试图以编程方式创建一个对话框微调器并将其添加到菜单选项(在工具栏中)。我设法让它工作(至少显示了 View ),但是没有调用它的 onItemSelected。

我的代码:

public class NewsFeed extends Fragment {
private static final String TAG = "tag";
private String tag;
private ArrayAdapter<New> newsadapter;
private ArrayAdapter<Tag> tagsadapter;
private Spinner spinner;

public NewsFeed() {
setHasOptionsMenu(true);
}

public static NewsFeed newInstance(String tag) {
NewsFeed fragment = new NewsFeed();
Bundle args = new Bundle();
args.putString(TAG, tag);
fragment.setArguments(args);
return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
tag = getArguments().getString(TAG);
}
setHasOptionsMenu(true);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getActivity().setTitle(tag);
NavigationView activitynav = (NavigationView) getActivity().findViewById(R.id.nav_view);
BottomNavigationView activitybuttomnav = (BottomNavigationView) getActivity().findViewById(R.id.navigation);
activitynav.setCheckedItem(R.id.nav_news);
activitybuttomnav.getMenu().getItem(1).setChecked(true);
View v = inflater.inflate(R.layout.fragment_news_feed, container, false);

//Spinner related code
tagsadapter = new TagsAdapter(getActivity(), android.R.layout.simple_spinner_item, (ArrayList<Tag>) ApplicationData.tags);
spinner = new Spinner(getActivity(), Spinner.MODE_DIALOG);
tagsadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setPrompt("Filtrar por categoria:");
spinner.setAdapter(tagsadapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

}

@Override
public void onNothingSelected(AdapterView<?> parent) {

}
});

newsadapter = new NewsAdapter(getActivity().getApplicationContext(), 0, (ArrayList<New>) ApplicationData.news);
ListView listview = (ListView) v.findViewById(R.id.listview);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
NewsDisplay nd = NewsDisplay.newInstance(tag, ApplicationData.news.get(position).getNewsUrl());
ft.addToBackStack(null);
ft.replace(R.id.fragmentcontent, nd).commit();
}
});
listview.setAdapter(newsadapter);
return v;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.main, menu);
super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();

if (id == R.id.filter_category) {
//For showing the spinner
spinner.performClick();
return true;
}
return super.onOptionsItemSelected(item);
}

已经尝试过:

使 NewsFeed 实现 OnItemSelectedListener。

在 SetOnItemSelectedListener 中创建 OnItemSelectedListener 对象。

你能帮我一些忙吗?这可能与这是一个 fragment 有关,并且工具栏在 Activity 中。

最佳答案

Spinner 是动态创建的(private val popupSpinner: Spinner by lazy { Spinner(this, Spinner.MODE_DIALOG) }),需要分配父 View 。如果没有,则 OnItemSelected 不会因为某种原因被调用。

我写了这个 hack 来缓解这个问题。添加到父 View 并将其隐藏。确保不要在 onResume() 方法和类似方法中运行它。

findViewById<ViewGroup>(android.R.id.content).addView(popupSpinner)
popupSpinner.visibility = View.INVISIBLE

附言。有些人可能认为这个问题没有答案。但是在评论中作者自己找到了解决办法。

关于Android Spinner onItemSelected 未在 Fragment 内部调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43261411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com