如何动态启用\禁用对话框视图
Posted
技术标签:
【中文标题】如何动态启用\\禁用对话框视图【英文标题】:How to enable\disable dialog views dynamically如何动态启用\禁用对话框视图 【发布时间】:2014-02-20 16:30:21 【问题描述】:我需要你的帮助。我的对话窗口有 2 个单选按钮。我想根据用户选中的单选按钮禁用或启用此对话框上的某些视图。
我的对话框布局:inc_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >
<EditText
android:id="@+id/inc_name"
android:layout_
android:layout_
android:layout_marginBottom="4dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginTop="16dp"
android:hint="Название дохода"
/>
<EditText
android:id="@+id/inc_value"
android:layout_
android:layout_
android:layout_marginBottom="16dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginTop="4dp"
android:hint="Сумма дохода"
/>
<TextView
android:id="@+id/tvChkBoxIncType"
android:layout_
android:layout_
android:layout_marginBottom="6dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="4dp"
android:layout_marginTop="4dp"
android:text="Тип дохода:" />
<LinearLayout
android:layout_
android:layout_ >
<RadioGroup
android:id="@+id/RadioGroup1"
android:layout_
android:layout_
android:orientation="horizontal" >
<RadioButton
android:id="@+id/inc_random"
android:layout_
android:layout_
android:layout_marginLeft="6dp"
android:onClick="onRadioButtonClicked"
android:text="Разовый" />
<RadioButton
android:id="@+id/inc_const"
android:layout_
android:layout_
android:layout_marginLeft="9dp"
android:checked="true"
android:onClick="onRadioButtonClicked"
android:text="Постоянный" />
</RadioGroup>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_ >
<TextView
android:id="@+id/DataPick1"
android:layout_
android:layout_
android:layout_gravity="top"
android:layout_marginLeft="16dp"
android:text="Начало периода:"
android:enabled="false"/>
<EditText
android:id="@+id/inc_day"
android:layout_
android:layout_
android:text="DD"
android:enabled="false" >
</EditText>
<EditText
android:id="@+id/inc_month"
android:layout_
android:layout_
android:text="MM"
android:enabled="false">
</EditText>
<EditText
android:id="@+id/inc_year"
android:layout_
android:layout_
android:enabled="false"
android:text="YYYY" >
</EditText>
</LinearLayout>
<EditText
android:id="@+id/inc_period"
android:layout_
android:enabled="false"
android:layout_
android:layout_marginBottom="4dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:text="Каждые Х дней" >
</EditText>
</LinearLayout>
此对话框的构建:
protected Dialog onCreateDialog(int id)
AlertDialog.Builder adb = new AlertDialog.Builder(this);
adb.setTitle("Добавить доход");
view = (LinearLayout) getLayoutInflater()
.inflate(R.layout.inc_dialog, null);
// устанавливаем ее, как содержимое тела диалога
adb.setView(view) .setPositiveButton("Cancel", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int id)
dialog.cancel();
) .setNegativeButton("OK", new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int id)
Toast.makeText(getApplicationContext(),"Добавлено", Toast.LENGTH_SHORT).show();
); ;
return adb.create();
我在 ACTIVITY 中调用的 onClick 函数
public void onRadioButtonClicked ()
switch(view.getId())
case R.id.inc_const:
findViewById(R.id.DataPick1).setEnabled(true);
break;
case R.id.inc_random:
findViewById(R.id.DataPick1).setEnabled(false);
break;
;
如果需要整个 Activity 代码。 Income.java
package com.example.pocketbooker;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class Income extends Activity
LinearLayout view;
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setTitle("Доходы");
setContentView(R.layout.income_const);
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.inoutgo, menu);
return super.onCreateOptionsMenu(menu);
protected Dialog onCreateDialog(int id)
AlertDialog.Builder adb = new AlertDialog.Builder(this);
adb.setTitle("Добавить доход");
view = (LinearLayout) getLayoutInflater()
.inflate(R.layout.inc_dialog, null);
// устанавливаем ее, как содержимое тела диалога
adb.setView(view) .setPositiveButton("Cancel", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int id)
dialog.cancel();
) .setNegativeButton("OK", new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int id)
Toast.makeText(getApplicationContext(),"Добавлено", Toast.LENGTH_SHORT).show();
); ;
return adb.create();
public boolean onOptionsItemSelected(MenuItem item)
// Handle presses on the action bar items
switch (item.getItemId())
case R.id.plus:
showDialog(1);
return true;
default:
return super.onOptionsItemSelected(item);
public void onRadioButtonClicked ()
switch(view.getId())
case R.id.inc_const:
findViewById(R.id.DataPick1).setEnabled(true);
break;
case R.id.inc_random:
findViewById(R.id.DataPick1).setEnabled(false);
break;
;
所以我想在我的对话框中动态更改视图的属性。我怎样才能做到这一点?如何从我的 Activity 函数中调用对话框视图? 对不起我的英语,我来自哈萨克斯坦。 请帮忙。
【问题讨论】:
初始化单选按钮然后检查它是否被选中或不根据启用/禁用 【参考方案1】:因为 DataPicker 在 Dialog 布局内,所以您需要在 onCreateDialog 方法中传递用户选择的RadioButton
id。试试看:
protected Dialog onCreateDialog(int id)
RadioGroup radioGroup = (RadioGroup) findViewById(R.id.RadioGroup1);
AlertDialog.Builder adb = new AlertDialog.Builder(this);
adb.setTitle("Добавить доход");
view = (LinearLayout) getLayoutInflater()
.inflate(R.layout.inc_dialog, null);
int radioBtnid = radioGroup.getCheckedRadioButtonId();
// get DatePicker
DatePicker datepick1=(DatePicker)view.findViewById(R.id.DataPick1);
if(radioBtnid==R.id.inc_const)
//Enable DataPick1
datepick1.setEnabled(true);
else if(radioBtnid==R.id.inc_random)
// Disable DataPick1
datepick1.setEnabled(false);
//your code ...
【讨论】:
它没有帮助。它只执行了 1 次..然后什么也没有发生【参考方案2】:首先将 View 作为参数传递给 onRadioButtonClicked() 方法,因为它是 XML 布局中提到的 onClick 方法所必需的。 将 View 定义为其唯一参数(这将是被点击的 View)
还可以通过调用 isChecked() 方法检查传递的视图是否被选中。您的最终代码可能如下所示:
public void onRadioButtonClicked(View view)
// Is the button now checked?
boolean checked = ((RadioButton) view).isChecked();
// Check which radio button was clicked
switch(view.getId())
case R.id.inc_const:
if (checked)
// Do the necessary things here if inc_const is selected
findViewById(R.id.DataPick1).setEnabled(true);
break;
case R.id.inc_random:
if (checked)
// Put the code necessary if the random is checked
findViewById(R.id.DataPick1).setEnabled(false);
break;
如果这有帮助,请告诉我。
【讨论】:
我是新来的,所以我希望人们在这里回答。不幸的是,它没有帮助。 (((【参考方案3】:所以我成功了。
我使用了 DialogFragment
为我的对话框创建了单独的类 Dialog_inc.java
package com.example.pocketbooker;
import android.annotation.SuppressLint;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.EditText;
@SuppressLint("NewApi")
public class Dialog_inc extends DialogFragment implements OnClickListener
EditText POLE;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
getDialog().setTitle("Добавить Доход");
View v = inflater.inflate(R.layout.inc_dialog, null);
v.findViewById(R.id.btnYes).setOnClickListener(this);
v.findViewById(R.id.btnNo).setOnClickListener(this);
v.findViewById(R.id.inc_const).setOnClickListener(this);
v.findViewById(R.id.inc_random).setOnClickListener(this);
POLE=(EditText) v.findViewById(R.id.inc_year);
return v;
public void onClick(View v)
switch(v.getId())
case R.id.inc_const:
POLE.setEnabled(true);
break;
case R.id.inc_random:
POLE.setEnabled(false);
break;
default:
dismiss();
public void onDismiss(DialogInterface dialog)
super.onDismiss(dialog);
public void onCancel(DialogInterface dialog)
super.onCancel(dialog);
为此稍微改变了我的布局,添加了 2 个按钮。 inc_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >
<EditText
android:id="@+id/inc_name"
android:layout_
android:layout_
android:layout_marginBottom="4dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginTop="16dp"
android:hint="Название дохода"
android:inputType="textEmailAddress" />
<EditText
android:id="@+id/inc_value"
android:layout_
android:layout_
android:layout_marginBottom="16dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginTop="4dp"
android:hint="Сумма дохода"
android:inputType="text" />
<TextView
android:id="@+id/tvChkBoxIncType"
android:layout_
android:layout_
android:layout_marginBottom="6dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="4dp"
android:layout_marginTop="4dp"
android:text="Тип дохода:" />
<LinearLayout
android:layout_
android:layout_ >
<RadioGroup
android:id="@+id/RadioGroup1"
android:layout_
android:layout_
android:orientation="horizontal" >
<RadioButton
android:id="@+id/inc_random"
android:layout_
android:layout_
android:layout_marginLeft="6dp"
android:onClick="OnRadio"
android:text="Разовый" />
<RadioButton
android:id="@+id/inc_const"
android:layout_
android:layout_
android:layout_marginLeft="9dp"
android:onClick="OnRadio"
android:checked="true"
android:text="Постоянный" />
</RadioGroup>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_ >
<TextView
android:id="@+id/DataPick1"
android:layout_
android:layout_
android:layout_gravity="top"
android:layout_marginLeft="16dp"
android:text="Начало периода:"
/>
<EditText
android:id="@+id/inc_day"
android:layout_
android:layout_
android:text="DD" >
</EditText><EditText
android:id="@+id/inc_month"
android:layout_
android:layout_
android:text="MM"
>
</EditText><EditText
android:id="@+id/inc_year"
android:layout_
android:layout_
android:text="YYYY" >
</EditText>
</LinearLayout>
<EditText
android:id="@+id/inc_period"
android:layout_
android:layout_
android:layout_marginBottom="4dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:onClick="onRadioButtonClicked"
android:text="Каждые Х дней" >
</EditText>
<LinearLayout
android:layout_
android:layout_>
<Button
android:id="@+id/btnYes"
android:layout_
android:layout_
android:layout_margin="10dp"
android:text="yes">
</Button>
<Button
android:id="@+id/btnNo"
android:layout_
android:layout_
android:layout_margin="10dp"
android:text="no">
</Button>
</LinearLayout>
</LinearLayout>
我这样称呼这个对话框。收入阶层
package com.example.pocketbooker;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.DialogFragment;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.LinearLayout;
public class Income extends Activity
LinearLayout view;
DialogFragment dlg1;
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setTitle("Доходы");
setContentView(R.layout.income_const);
dlg1 = new Dialog_inc();
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.inoutgo, menu);
return super.onCreateOptionsMenu(menu);
@SuppressLint("NewApi")
public boolean onOptionsItemSelected(MenuItem item)
// Handle presses on the action bar items
switch (item.getItemId())
case R.id.plus:
dlg1.show(getFragmentManager(), "dlg1");
return true;
default:
return super.onOptionsItemSelected(item);
当然现在它不是一个漂亮的代码。但我希望它可以帮助某人。谢谢大家的回复
【讨论】:
以上是关于如何动态启用\禁用对话框视图的主要内容,如果未能解决你的问题,请参考以下文章