setEnabled()和setClickable()无效

9
我已经使用FrameLayout,其中包含两个LinearLayouts。第二个LinearLayout最初是不可见的,但当我在第一个布局上按下按钮时,第二个布局变为可见并覆盖第一个布局。我的要求是,当第二个布局出现时,第一个布局的元素不应该可点击(或启用)。
为此,我尝试了setEnabled(false)和setClickable(false),但这两个都没有起作用,我不知道问题出在哪里。
以下是代码:
TableLayout table; 

EditText edit;  
ScrollView scroll;

Button btn_save;
Button btn_layer_save;
Button btn_cross;

AlertDialog alert_dialog;

LinearLayout layout_above;

int primary_selected;

RadioButton radio_geo;
RadioButton radio_alumni;

String geo = "no" ;
String alumni = "no" ;

int color;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    table = (TableLayout) findViewById(R.id.tableLayout1);
    edit = (EditText) findViewById(R.id.message_select_friends_edit_search);
    search_geo_name_list = new ArrayList<String>();
    search_id_list = new ArrayList<String>();

    scroll = (ScrollView) findViewById(R.id.register_scroll_view);

    btn_cross = (Button) findViewById(R.id.register_cross);
    btn_save = (Button) findViewById(R.id.register_save);
    btn_layer_save  = (Button) findViewById(R.id.register_layer_save);

    btn_cross.setOnClickListener(this);
    btn_save.setOnClickListener(this);
    btn_layer_save.setOnClickListener(this);

    layout_above = (LinearLayout) findViewById(R.id.regsiter_layout_layer_above);

    createTableRows(name_list,id_list);



}

void createTableRows(ArrayList<String> list_name , ArrayList<String> list_id )
{
    /*-----R O W S   O F   T A B L E   C R E A T E D   D Y N A M I C A L L Y ------*/
}

@Override
public void onClick(View v) 
{
    // TODO Auto-generated method stub

    switch (v.getId())
    {
    case R.id.register_save:

          layout_above.setVisibility(LinearLayout.VISIBLE);
          btn_save.setVisibility(LinearLayout.INVISIBLE);

        scroll.setEnabled(false);
        edit.setEnabled(false);
        edit.setClickable(false);
        scroll.setClickable(false);

        break;

    case R.id.register_cross:
        Toast.makeText(this, "Cross Cancel", 1000).show();
        Intent intent = new Intent(this, TestSave.class);
        startActivity(intent);
        finish();
        break;
    case R.id.register_layer_save:
        selectedInfo();
        break;

    } 

}`

你能否发布一下你尝试过的代码? - Pankaj Kumar
4个回答

8

将前端布局的大小作为背景布局的大小,并将前端布局的背景颜色设置为透明,以便部分显示背景布局。同时在前端布局中设置一个onClick监听器,在onClick方法中不执行任何操作。

这个答案可能不完全符合您的要求,但它是一个很好的替代方案。

希望能对您有所帮助。


3
尝试使用setFocusable(False);也许这会有所帮助。

0

尝试与孩子一起工作,而不是仅仅关注布局本身

LinearLayout l=(LinearLayout) findViewById(R.layout.layout2);
                int num=l.getChildCount();
                for(int i=0;i<l.getChildAt(0);i++)
                    if(l.getChildAt(i).isClickable()||l.getChildAt(i).isEnabled()) 
                            {
l.getChildAt(i).setClickable(false);
l.getChildAt(i).setEnabled(false);
}

这个布局如果有嵌套子项,那么这种方法就不起作用了。我们需要为每个子项及其子项的子项设置 clickable false。我已经在下面发布了一个嵌套实现的例子。 - alchemist

0

你可以使用递归来实现这个功能,并递归地禁用所有子元素的可点击属性。

public static void enableDisableViewGroup(ViewGroup viewGroup, boolean enabled) {
int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
  View view = viewGroup.getChildAt(i);
  view.setEnabled(enabled);
  if (view instanceof ViewGroup) {
    enableDisableViewGroup((ViewGroup) view, enabled);
  } else if (view instanceof ListView) {
    view.setEnabled(enabled);
    ListView listView = (ListView) view;
    int listChildCount = listView.getChildCount();
    for (int j = 0; j < listChildCount; j++) {
      listView.getChildAt(j).setEnabled(enabled);
    }
  }
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接