布局的动态 id 的 setVisibility true

Posted

技术标签:

【中文标题】布局的动态 id 的 setVisibility true【英文标题】:setVisibility true of dynamic id of a layout 【发布时间】:2017-01-28 07:09:52 【问题描述】:

我创建了ListView,其中每个按钮 id 都包含 database_idx10+button_number

例如,我将 id 设置为 101 即 10=database_id & 1=button_number

现在我要 setVisibility of id 101View.GONE 这是我生成的唯一 id。

如何使用这个生成的 id 来设置可见性。

我通过调用用户定义函数“click”来检索这个 id,并且在 xml 中我设置了android:onClick="click"

public void click(View view) 
    final int position = view.getId();
    int button_number = position % 10;
    int id = position/10;
    int layout_id=id*10+2;

    if(button_number==1)
        //have to set visibity true of layout_id
    

注意

我能够将可见性从可见设置为消失按钮,但不能设置 对面。

【问题讨论】:

考虑到你在getView方法中设置了onClickListener,你还应该在"if"后面写else条件,这样会使视图不可见,因为视图被回收并保留了之前的属性。 @SarthakMittal android:onClick="click" 在 xml 中不在 getView 方法中 好的,但这是一个列表项,对吧?如果是,那么还要加上else语句 这只是与我的问题相关的代码的一部分,但请记住 为什么有必要为列表中的每个列表项中的每个按钮设置唯一的 ID? 【参考方案1】:

如果此按钮是您的视图对象的子项,您可以执行类似的操作

Button btn = (Button) view.findViewById(your_id);
btn.setVisibility(View.VISIBLE);

如果不是,您必须在他的父布局或活动中找到此视图。

【讨论】:

尝试在空对象引用上调用虚拟方法“void android.view.View.setVisibility(int)” 使用代码`View btn = view.findViewById(layout_id); btn.setVisibility(View.VISIBLE);` 解释你的视图结构。您在 ListView 中有按钮,并且您想在按钮单击右后更改另一个视图可见性?这另一个视图是 ListView 子 od 这是活动或片段中的单独视图? 问题最初是我设置了android:visibility="gone"所以按钮或布局不存在于你所说的DOM中 dom/body @ReazMurshed 中没有问题对象【参考方案2】:

这不是所提问题的解决方案,但无论如何,在列表项中唯一标识一个按钮很容易。实际上,您不必自己设置唯一 ID。列表中每个按钮的 View 引用已经不同。您只需在您的getView 方法中使用position 来识别它们。

这是您列表中适配器的示例getView 方法。

public View getView (int position, View convertView, ViewGroup parent)
    if( convertView == null )
        //We must create a View:
        convertView = inflater.inflate(R.layout.my_list_item, parent, false);
    
    // Here we can do changes to the convertView
    Button b = convertView.findViewById(R.id.button);

    // Set your visibility here
    if(your_condition_is_true) b.setVisibility(View.VISIBLE);
    else b.setVisibility(View.GONE);

    return convertView;

【讨论】:

view.setVisibility(View.VISIBLE); 您如何定位特定的 id 或按钮? getView 将在我单击列表中的任何内容时被调用? 在点击事件创建列表时我不必这样做 getView 绑定您的每个列表项。 onClick 将在每个列表项上设置为 convertView.findViewById(R.id.your_button).setOnClickListener(...)【参考方案3】:

尝试这样做 view.setVisibility(View.VISIBLE);

【讨论】:

我将在哪里设置这个? public void click(View view) final int position = view.getId(); int button_number = 位置 % 10; int id = 位置/10; int layout_id=id*10+2; if(button_number==1) view.setVisibility(View.VISIBLE); 【参考方案4】:

您需要Details 类中的boolean 变量来保持详细信息部分的可见性。

您的适配器代码应该是,

class MyAdapter extends BaseAdapter 

    ArrayList<Details> list;
    Context context;

    public MyAdapter(Context context, RealmResults<Details> result2) 
        this.context = context;
        this.list = result2;
    

    public class Holder 
        TextView topic;
        TextView detail;
        LinearLayout details;
        ImageButton send;
        ImageButton edit;
        ImageButton delete;

        public Holder(View v) 
            this.topic= (TextView) v.findViewById(R.id.TextView1);
            this.detail= (TextView) v.findViewById(R.id.td);
            this.details = (LinearLayout) v.findViewById(R.id.details);
            this.send= (ImageButton) v.findViewById(R.id.imagebutton1);
            this.edit= (ImageButton) v.findViewById(R.id.imagebutton3);
            this.delete= (ImageButton) v.findViewById(R.id.imagebutton2);
        
    

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) 
        View row=view;
        Holder holder=null;
        if(row == null) 
            LayoutInflater inflater= (LayoutInflater) context.getSystemService(MainActivity.context.LAYOUT_INFLATER_SERVICE);
            row= inflater.inflate(R.layout.layout,viewGroup,false);
            holder = new Holder(row);
            row.setTag(holder);
         else 
            holder= (Holder) row.getTag();
        

        final Details temp = (Details) getItem(i);

        holder.topic.setText(temp.getTopic());
        holder.detail.setText(temp.getTopic_details());

        if(temp.isDetailButtonVisible())
            holder.details.setVisiblity(View.VISIBLE);
         else 
            holder.details.setVisiblity(View.GONE);         
        

        holder.topic.setOnClickListener(new OnClickListener() 
            @Override
            public void onClick(View v) 
                temp.setDetailButtonVisibility(false);
            
        );

        holder.send.setOnClickListener(new OnClickListener() 
            @Override
            public void onClick(View v) 

            
        );

        holder.detail.setOnClickListener(new OnClickListener() 
            @Override
            public void onClick(View v) 

            
        );



        holder.edit.setOnClickListener(new OnClickListener() 
            @Override
            public void onClick(View v) 

            
        );

        holder.delete.setOnClickListener(new OnClickListener() 
            @Override
            public void onClick(View v) 

            
        );

        return row;
    



你的布局应该是,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_
    android:layout_
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp">

    <LinearLayout
        android:layout_
        android:layout_
        android:weightSum="6"
        android:orientation="horizontal"
        android:background="#5894CA"
        android:clickable="true">

        <TextView
            android:layout_
            android:layout_
            android:layout_weight="4"
            android:id="@+id/TextView1"
            android:text="Bank of baroda details...."
            android:layout_marginStart="10dp"
            android:textStyle="bold"
            android:fontFamily="sans-serif-condensed"
            android:layout_marginTop="10px"
            android:textSize="20dp" />

        <LinearLayout
            android:layout_
            android:layout_
            android:layout_weight="2"
            android:orientation="horizontal">

            <ImageButton
                android:layout_
                android:layout_
                android:id="@+id/imagebutton1"
                android:background="@drawable/share" />

            <ImageButton
                android:layout_
                android:layout_
                android:id="@+id/imagebutton3"
                android:layout_marginStart="10dp"
                android:background="@drawable/edit_text" />

            <ImageButton
                android:layout_
                android:layout_
                android:id="@+id/imagebutton2"
                android:layout_marginStart="10dp"
                android:background="@drawable/gnome_edit_delete" />

            </LinearLayout>

    </LinearLayout>

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:clickable="true"
        android:id="@+id/details"
        android:visibility="invisible" >

        <TextView
            android:layout_
            android:layout_
            android:background="@drawable/bg"
            android:text="I have a LinearLayout that I've styled to look like a button, and it contains a few text/ImageView elements. I would like to make the whole LinearLayout act like a button, in particular to give it states that are defined in a so it has a different background when it is pressed..."
            android:layout_margin="10dp"
            android:id="@+id/td" />

    </LinearLayout>

</LinearLayout>

【讨论】:

isDetailButtonVisible 方法? 阅读我回答的第一行。 isDetailButtonVisible 是该变量的包装器。 temp.setDetailButtonVisibility(false); temp 不能被内部类访问 list.setAdapter(context,new MyAdapter(result2));关于 Mainactivity 给出错误我不知道为什么 试试list.setAdapter(new MyAdapter(context, result2));

以上是关于布局的动态 id 的 setVisibility true的主要内容,如果未能解决你的问题,请参考以下文章

ListView中动态显示隐藏HeaderView和FooterView

ListView: setvisibility() 强制刷新所有行

android能否让一个布局或一个组件完全隐藏并且不占位置

Android:为什么setVisibility(View.GONE);或setVisibility(View.INVISIBLE);不工作

setVisibility(GONE)视图变为不可见但仍占用空间

Android setVisibility无法在PagerAdapter中运行