【问题标题】:Is it possible to get a Button view from ListView Fragment instead of ListView Adapter?是否可以从 ListView Fragment 而不是 ListView Adapter 获取 Button 视图?
【发布时间】:2023-03-23 04:45:01
【问题描述】:

我有这个:

红色方块是包含多个片段的活动,几乎所有片段都是列表,它们都有不同的项目,但由我的自定义 ListAdapter 类构建。

橙色方块就是其中之一,实际上它是正确的drawer。该片段从 ListFragment 扩展而来,并扩展了一个没有 Items 的简单 xml。

在片段的onActivityCreated 内部,我实例化了一个自定义 ListAdapter,我用您在屏幕截图中看到的项目填充它。

根据我想要的项目类型,我有几个 xml,在这里你可以看到其中的 3 个:

  • 按钮标题(绿色方块)
  • 可勾选项(右侧可勾选)
  • 常规标题(写着“Día y hora del viaje”的标题)

按钮标题(绿色方块)xml是一个简单的线性布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/menu_row_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <ImageButton
        android:id="@+id/row_button"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:padding="10dp" />

    <TextView
        android:id="@+id/row_title"
        android:layout_width="0px"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:minLines="1"
        android:padding="10dp"
        android:textAppearance="@android:style/TextAppearance.Medium"
        android:textStyle="bold" />

</LinearLayout>

我想要做的是从橙色方块(我的自定义 ListFragment 类)访问按钮来设置点击监听器。我已经进行了研究,并且我知道我可以从适配器中做到这一点(我已经成功尝试过),但这就是我不想要的,因为在其他菜单中,我将有其他行为不同的按钮,但它们是将调用相同的侦听器,因为它们是由相同的适配器构建的。

我在Fragment充气后试过了:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View fragmentView = inflater.inflate(R.layout.menu_list, null); 
    //Button of location settings
    ((ImageButton)fragmentView.findViewById(R.id.row_button)).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
                //Do here stuff I want to
        }
    }); 
    super.onStart();
    return fragmentView;
}

同样来自onStart

@Override
public void onStart() {
    //Button of location settings
    ((ImageButton)getView().findViewById(R.id.row_button)).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
                //Here my stuff
        }
    }); 
    super.onStart();
}

还有setListAdapter()之后

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    //A new instance of my own ListAdapter
    MyListAdapter adapter = new MyListAdapter(getActivity());
    //Prepare my items and its propierties within adapter
    //...
    //Set the Adapter
    setListAdapter(adapter);
    //And then try to get the Button view
    //Button of location settings
    ((ImageButton)getView().findViewById(R.id.row_button)).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            //My stuff here
        }
    }); 
}

但是你猜怎么着......我总是在 xml 膨胀片段时遇到同样的错误。如果我删除设置点击侦听器的行,它可以工作,但显然按钮什么都不做。

非常感谢任何帮助。

【问题讨论】:

  • 您的按钮位于一行中,因此您只能从列表适配器(getView())中找到它。从您的片段中调用findViewById() 无法返回包含在您的ListView 中的视图。
  • 我想我已经把问题的标题说得更清楚了。我知道这可能来自 getView() 方法中的 ListAdapter,但正如我解释的那样,这就是我不想要的,因为所有 ListViewFragments 都从同一个适配器膨胀(将对所有片段中的所有按钮执行相同的操作)。是否可以从片段本身获取按钮视图?
  • 不,你不能。找到您的按钮的唯一方法是在getView(),但您可以直接覆盖它,调用findViewById(),如果它不返回 null,那么您找到了您的按钮。
  • 在这种情况下,由于所有片段的行 XML 都是相同的(因此即使对于同时显示的不同片段,按钮 id 也是相同的),我如何识别我正在单击的按钮?假设我有两行按钮,如果两个按钮的 ID 相同,我怎么知道我刚刚点击了哪个按钮?
  • 一种解决方案是在您为按钮充气时为其设置一个标签,然后在单击按钮时根据该标签做一些事情。无论如何,实现自己的getView() 方法似乎是必要的。

标签: android onclicklistener listadapter android-listfragment


【解决方案1】:

这是来自 cmets 的答案:

您的按钮位于ListView 的一行中,因此您只能从列表适配器中找到它(在getView() 中)。从片段中调用 findViewById() 无法返回 ListView 中包含的视图。

一种解决方案是在您为按钮充气时为其设置一个标签,然后在单击按钮时根据该标签做一些事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多