Android Eclipse editText 在本地实例上的 setText 后不显示
Posted
技术标签:
【中文标题】Android Eclipse editText 在本地实例上的 setText 后不显示【英文标题】:Android Eclipse editText not displaying after setText on local instance 【发布时间】:2011-11-08 15:03:48 【问题描述】:我通过“instanceOf”调用了一些 EditText,因为我不一定知道它们的确切名称/ID。当我这样做以获取文本时,它工作得很好。但是当我尝试基于本地 instanceOf EditText 设置文本()时,它不会显示我正在传递的字符串。奇怪的是,当我 setText 然后记录 getText 时,它会正确记录它——它只是不会物理显示它。
我还测试了将可见性设置为 View.INVISIBLE 或 View.GONE 只是为了看看我是否可以与之交互,但它什么也没做。
这里是设置文本然后记录它的代码 sn-p:
LinearLayout mLayout = (LinearLayout) main_fields_holder.getChildAt(0);
LinearLayout mLayout2 = (LinearLayout) mLayout.getChildAt(0);
LinearLayout mLayout3 = (LinearLayout) mLayout2.getChildAt(1);
for(int i = 0; i < mLayout3.getChildCount(); i++)
View v = (View) mLayout3.getChildAt(i);
if (v instanceof EditText)
EditText e = (EditText) v;
e.setText("HELLO");
Log.v("USER TEXT", "Text is: " + e.getText().toString() + "!");
;
我还应该提到,我对按钮文本执行相同的 instanceOf 方法,它也不会显示我的 setText。
是否有某些原因导致无法操作 editText(或按钮)的本地实例?
顺便说一句,Log.v("USER TEXT", "Text is: " + e.getText().toString() + "!");确实给了我“你好!”。我什至不确定这对我的问题意味着什么。
主要布局文件为:
<?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:background="#fff"
xmlns:android1="http://schemas.android.com/apk/res/android">
<ScrollView android:id="@+id/scrollView1" android:layout_ android:layout_>
<LinearLayout
android:orientation="vertical"
android:layout_
android:layout_ android1:focusable="false">
<LinearLayout android:id="@+id/item_edit_linear"
android:layout_
android:background="@drawable/backrepeat"
android:layout_
>
<TextView android:layout_ android:layout_ android:id="@+id/add_item_text" android:text="Add New Item" android:textStyle="bold" android:paddingLeft="15dip" android1:paddingTop="8dip" android1:textSize="12pt" android1:textColor="@color/blue"></TextView>
</LinearLayout>
<LinearLayout android1:layout_ android1:layout_ android1:orientation="vertical" android1:paddingLeft="15dip" android1:background="@drawable/borderlines" android1:paddingBottom="15dip" android1:paddingTop="10dip" android1:id="@+id/spinner_holder_layout">
<TextView android1:layout_ android1:layout_ android1:paddingTop="5dip" android1:text="Item Name:" android1:textColor="@color/gray" android1:paddingBottom="5dip"></TextView>
<EditText android1:layout_ android1:layout_ android1:id="@+id/edit_item_title">
<requestFocus></requestFocus>
</EditText>
<TextView android1:layout_ android1:layout_ android1:paddingTop="5dip" android1:id="@+id/textView9" android1:text="Select Category:" android1:textColor="@color/gray" android1:paddingBottom="5dip"></TextView>
<Spinner android1:layout_ android1:layout_ android1:prompt="@string/edit_item_category_spinner_text" android1:id="@+id/edit_item_category_spinner" android1:entries="@array/categoryList" android1:paddingBottom="10dip"></Spinner>
<LinearLayout android1:layout_ android1:layout_ android1:orientation="vertical" android1:id="@+id/item_spinner_layout" android1:visibility="gone">
<TextView android1:layout_ android1:layout_ android1:paddingTop="5dip" android1:id="@+id/textView10" android1:text="Select Item" android1:textColor="@color/gray" android1:paddingBottom="5dip"></TextView>
<Spinner android1:layout_ android1:layout_ android1:prompt="@string/edit_item_item_spinner_text" android1:paddingBottom="10dip" android1:id="@+id/edit_item_spinner"></Spinner>
</LinearLayout>
</LinearLayout>
<LinearLayout android1:layout_ android1:layout_ android1:orientation="vertical" android1:id="@+id/editItemFields">
</LinearLayout>
<LinearLayout android1:layout_marginLeft="15dip" android1:layout_ android1:layout_ android1:id="@+id/date_time_container" android1:visibility="gone">
<LinearLayout android1:layout_ android1:layout_ android1:id="@+id/linearLayout7" android1:orientation="vertical">
<TextView android1:layout_ android1:id="@+id/dep_date_text" android1:textColor="@color/gray" android1:layout_marginBottom="10dip" android1:text="Departure Date:" android1:gravity="right|center" android1:layout_></TextView>
<TextView android1:layout_ android1:id="@+id/dep_time_text" android1:textColor="@color/gray" android1:layout_marginBottom="9dip" android1:text="Depature Time:" android1:gravity="right|center" android1:layout_></TextView>
<TextView android1:layout_ android1:id="@+id/arr_date_text" android1:textColor="@color/gray" android1:layout_marginBottom="9dip" android1:text="Arrival Date:" android1:gravity="right|center" android1:layout_></TextView>
<TextView android1:layout_ android1:id="@+id/arr_time_text" android1:textColor="@color/gray" android1:layout_marginBottom="9dip" android1:text="Arrival Time:" android1:gravity="right|center" android1:layout_></TextView>
</LinearLayout>
<LinearLayout android1:layout_marginLeft="5dip" android1:layout_ android1:layout_ android1:id="@+id/linearLayout8" android1:orientation="vertical">
<Button android1:layout_ android1:layout_ android1:id="@+id/departure_date" android1:minWidth="125dip" android1:text="Button"></Button>
<Button android1:layout_ android1:layout_ android1:id="@+id/departure_time" android1:minWidth="125dip" android1:text="Button"></Button>
<Button android1:layout_ android1:layout_ android1:id="@+id/arrival_date" android1:minWidth="125dip" android1:text="Button"></Button>
<Button android1:layout_ android1:layout_ android1:id="@+id/arrival_time" android1:minWidth="125dip" android1:text="Button"></Button>
</LinearLayout>
</LinearLayout>
<LinearLayout android:layout_ android:id="@+id/editItemLinearLayout"
android:layout_ android:orientation="vertical" android1:paddingLeft="15dip" android1:visibility="gone">
<TextView android:text="Cost" android:id="@+id/textView1"
android:layout_ android:layout_>
</TextView>
<EditText android:layout_
android:layout_ android:id="@+id/edit_item_cost">
</EditText>
<TextView android:text="Contact Phone" android:id="@+id/textView2"
android:layout_ android:layout_>
</TextView>
<EditText android:layout_
android:layout_ android:id="@+id/edit_item_phone">
</EditText>
<TextView android:text="Carrier" android:id="@+id/textView3"
android:layout_ android:layout_>
</TextView>
<EditText android:layout_
android:layout_ android:id="@+id/edit_item_carrier">
</EditText>
<TextView android:text="Names" android:id="@+id/textView4" android:layout_ android:layout_></TextView>
<EditText android:layout_ android:layout_ android:id="@+id/edit_item_names">
</EditText>
<TextView android:text="Departure Location" android:id="@+id/textView5"
android:layout_ android:layout_>
</TextView>
<EditText android:layout_
android:layout_ android:id="@+id/edit_item_departure_location">
</EditText>
<TextView android:text="Arrival Location" android:id="@+id/textView6"
android:layout_ android:layout_>
</TextView>
<EditText android:layout_
android:layout_ android:id="@+id/edit_item_arrival_location">
</EditText>
<TextView android:id="@+id/textView7" android:layout_ android:layout_ android:text="Date"></TextView>
<Button android:text="Button" android:layout_ android:layout_ android:id="@+id/edit_item_reminder_date"></Button>
<TextView android:id="@+id/textView8" android:layout_ android:layout_ android:text="Time"></TextView>
<Button android:text="Button" android:layout_ android:layout_ android:id="@+id/edit_item_reminder_time"></Button>
</LinearLayout>
<RelativeLayout android1:layout_ android1:layout_marginTop="50dip"
android1:id="@+id/relativeLayout1" android1:layout_>
<Button android1:id="@+id/edit_item_confirm" android1:layout_ android1:layout_ android1:background="@drawable/savebutton" android1:layout_alignParentBottom="true"></Button>
<Button android1: android1:background="@drawable/cancelbutton" android1:layout_ android1:id="@+id/item_creation_cancel" android1:layout_ android1:layout_alignParentRight="true" android1:layout_alignParentBottom="true"></Button>
</RelativeLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
通过代码,我使用以下内容填充了 editItemFields 布局:
<LinearLayout android1:paddingLeft="15dip" android1:layout_
android1:background="@color/white" android1:id="@+id/flight_edit_container"
android1:orientation="vertical" android1:layout_
xmlns:android1="http://schemas.android.com/apk/res/android" android1:paddingTop="10dip">
<LinearLayout android1:layout_ android1:layout_ android1:id="@+id/linearLayout6">
<LinearLayout android1:layout_ android1:layout_ android1:id="@+id/linearLayout7" android1:orientation="vertical">
<TextView android1:id="@+id/TextView02" android1:textColor="@color/gray" android1:layout_ android1:gravity="right|center" android1:layout_ android1:layout_marginBottom="10dip" android1:text="Airline:"></TextView>
<TextView android1:text="Flight #:" android1:id="@+id/TextView05" android1:textColor="@color/gray" android1:layout_ android1:gravity="right|center" android1:layout_ android1:layout_marginBottom="10dip"></TextView>
<TextView android1:text="Gate:" android1:id="@+id/TextView04" android1:textColor="@color/gray" android1:gravity="right|center" android1:layout_ android1:layout_ android1:layout_marginBottom="10dip"></TextView>
<TextView android1:id="@+id/TextView09" android1:textColor="@color/gray" android1:layout_ android1:gravity="right|center" android1:text="Departure Location:" android1:layout_ android1:layout_marginBottom="10dip"></TextView>
<TextView android1:text="Departure Airport:" android1:id="@+id/TextView14" android1:textColor="@color/gray" android1:layout_ android1:gravity="right|center" android1:layout_ android1:layout_marginBottom="10dip"></TextView>
<TextView android1:text="Confirmation #:" android1:id="@+id/TextView12" android1:textColor="@color/gray" android1:layout_ android1:gravity="right|center" android1:layout_ android1:layout_marginBottom="9dip"></TextView>
<TextView android1:gravity="right|center" android1:text="Destination:" android1:id="@+id/TextView08" android1:textColor="@color/gray" android1:layout_ android1:layout_ android1:layout_marginBottom="9dip"></TextView>
<TextView android1:text="Arrival Airport:" android1:id="@+id/TextView15" android1:textColor="@color/gray" android1:layout_ android1:gravity="right|center" android1:layout_ android1:layout_marginBottom="9dip"></TextView>
<TextView android1:text="Cost:" android1:id="@+id/TextView09" android1:textColor="@color/gray" android1:layout_ android1:gravity="right|center" android1:layout_ android1:layout_marginBottom="9dip"></TextView>
<TextView android1:text="Class:" android1:id="@+id/TextView08" android1:textColor="@color/gray" android1:layout_ android1:gravity="right|center" android1:layout_ android1:layout_marginBottom="9dip"></TextView>
<TextView android1:text="Seat:" android1:id="@+id/TextView11" android1:textColor="@color/gray" android1:layout_ android1:gravity="right|center" android1:layout_ android1:layout_marginBottom="9dip"></TextView>
<TextView android1:text="Travelers:" android1:id="@+id/TextView12" android1:textColor="@color/gray" android1:layout_ android1:gravity="right|center" android1:layout_ android1:layout_marginBottom="9dip"></TextView>
<TextView android1:text="Memo:" android1:id="@+id/TextView13" android1:textColor="@color/gray" android1:layout_ android1:gravity="right|center" android1:layout_ android1:layout_marginBottom="9dip"></TextView>
</LinearLayout>
<LinearLayout android1:layout_ android1:layout_ android1:id="@+id/linearLayout8" android1:orientation="vertical" android1:layout_marginLeft="5dip">
<EditText android1:layout_ android1:layout_ android1:id="@+id/flight_airline"></EditText>
<EditText android1:layout_ android1:id="@+id/flight_number" android1:layout_></EditText>
<EditText android1:layout_ android1:id="@+id/flight_gate" android1:layout_></EditText>
<EditText android1:layout_ android1:id="@+id/flight_deplocation" android1:layout_></EditText>
<EditText android1:layout_ android1:id="@+id/flight_depairport" android1:layout_></EditText>
<EditText android1:layout_ android1:id="@+id/flight_confirmation" android1:layout_></EditText>
<EditText android1:layout_ android1:layout_ android1:id="@+id/flight_destination"></EditText>
<EditText android1:layout_ android1:layout_ android1:id="@+id/flight_arrairport">
</EditText>
<EditText android1:layout_ android1:layout_ android1:id="@+id/flight_cost"></EditText>
<EditText android1:layout_ android1:layout_ android1:id="@+id/flight_class"></EditText>
<EditText android1:layout_ android1:layout_ android1:id="@+id/flight_seat"></EditText>
<Button android1:text="Button" android1:minWidth="125dip" android1:id="@+id/flight_travelers" android1:layout_ android1:layout_></Button>
<EditText android1:layout_ android1:id="@+id/flight_memo" android1:layout_></EditText>
</LinearLayout>
</LinearLayout>
</LinearLayout>
我基本上会深入到布局中,直到我处于包含我的 editTexts 的线性布局中。
最后,这里是膨胀布局的代码sn-ps:
main_fields_holder = (LinearLayout) findViewById(R.id.editItemFields);
view = LayoutInflater.from(getBaseContext()).inflate(R.layout.flight_fields,
null);
main_fields_holder.addView(view);
更新: 只是为了测试,我添加了这一行,看看我是否可以通过 id 硬引用它:
EditText a = ((EditText)findViewById(R.id.flight_airline));
a.setText("HELLO");
它仍然不会出现。我膨胀包含这些项目的布局这一事实与它有什么关系吗?基本上,选择旋转器项目时,布局膨胀,我尝试在该布局中设置项目的文本,但无济于用。顺便说一句,我仍然可以在设置 EditText 之后追踪它的值,但是这个 bugger 只是不会实际出现。
【问题讨论】:
【参考方案1】:仅供参考,我想通了。不管出于什么原因,应用程序需要一点时间来处理所有获取信息并设置它们的函数,所以我添加了一个 post 处理程序:
handler.postDelayed(new Runnable() 公共无效运行() 填充字段(项目); , 500);
这 1/2 秒的等待使信息能够正确显示。谢谢大家的回答
【讨论】:
行得通!一些解释会很好,我不知道为什么会这样:)【参考方案2】:在检索Views
和findViewById()
时似乎存在非常细微但重要的区别。
如果您以“本地方式”调用findViewById(R.id.yourEditText)
,例如在 onResume()
方法的***行中,EditText
似乎表现正确,setText(...)
在显示中显示新值。
但是如果你把 Activity 放到另一个 Object 的成员变量中(例如一些 POJO),你这样做:
editText = pojo.getActivity().findViewById(R.id.EditText);
您仍然会找到一个无法区分的 EditText-Object,但 setText()
不再起作用。我不知道为什么。
我花了很多时间才找到这个(API 7 级项目)。呵呵!!!
(哎呀——算了。我没有 POJO,但是一些错误的 Map-caching 给了我一个旧的 Activity-Object)
【讨论】:
【参考方案3】:听起来很像你没有得到你认为的EditText
。如果您提供更多详细信息,也许我们可以帮助您找到合适的。
更新:
看来您确实知道ID,问题是它们不是唯一的。解决方案是从视图层次结构中的已知点开始,您知道它们是唯一的。例如,在扩展 editItemFields
布局后,您会在 view
变量中引用该视图层次结构的根。然后,您可以执行以下操作:
EditText flightNumberEditText = (EditText) view.findViewById(R.id.flight_number);
您将获得该特定项目的flight_number
EditText
。
【讨论】:
我考虑过,但问题是我有一个带有一堆 EditText 的布局,并且没有一个显示任何应该显示的文本。它显然至少找到了一些编辑文本,因为我没有得到空指针异常。布局是通过布局充气器添加的。这会改变什么吗? 编辑您的帖子以包含布局文件和您实例化/膨胀 mLayout3 的代码,我会看看。 啊,但问题是我有多个可以膨胀的视图。我刚刚发布了其中一个观点。我或多或少试图动态设置膨胀布局的edittexts的文本,所以我不能使用findViewById 对,但这也是我要说的。 :) 如果您可以找到每个根视图,您可以从该根视图开始并在该根视图上调用findViewById
,它将在该视图的层次结构下而不是顶层搜索。
如果我要这样做,我将不得不为所有 109 个 editTexts 设置一个单独的 findViewById,不是吗?我希望以一种动态的方式(如上)完成此操作,我不搜索特定的 id【参考方案4】:
尝试做:
final EditText a = ((EditText)findViewById(R.id.flight_airline));
a.post(new Runnable()
@Override
public void run()
a.setText("HELLO");
);
这比当前标记为已接受的解决方案要好得多。 这将在实际准备好时将其发布到 UI,而不是等待大约 1/2 秒。
【讨论】:
【参考方案5】:当您应该能够使用它时,在创建 EditText 时设置它的 ID。
e.setId(15); //15 is any positive integer
相反,你总是可以尝试
e.getEditableText();
【讨论】:
感谢您的建议,但这似乎没有任何帮助。我在“EditText e = (EditText) v”之后添加了 e.setId(15),但没有结果。我还应该提到我对按钮文本执行相同的 instanceOf 方法,它也不会显示我的 setText 【参考方案6】:试试
((EditText) v).setText("HELLO");
【讨论】:
感谢您的建议。这似乎也不能解决问题。让我感到困惑的是,在我班级的不同部分,我正在做完全相同的事情,除了我使用 getText() 并且它正在获取正确的文本。 我不确定 getChildAt() 是返回对视图的引用还是它的副本。因此,如果它返回副本,您将能够 getText(),但设置它不会有任何效果,因为它不是您的 mLayout3 中的视图,而是它的副本 - 这就是您获得正确日志的原因 这是有道理的。有没有办法在不硬编码确切的 findViewById id 的情况下设置原始文本而不是副本? 我错了,它似乎正在返回参考,因为LinearLayout mainLL = (LinearLayout)findViewById(R.id.main_LL); View testV = (View)mainLL.getChildAt(0); ((TextView)testV).setText("test"); Log.v("out: ", ((TextView)mainLL.getChildAt(0)).getText().toString());
的工作原理与预期相同。你应该听从 kabuko 的建议,确保你得到了你真正需要的 EditText
我得到了我需要的所有编辑文本。我得到每一个并使用每一个。问题是我能得到它们的唯一方法是遍历所有布局子项,直到我找到一个editText,我似乎无法正确地将它引用到 setText以上是关于Android Eclipse editText 在本地实例上的 setText 后不显示的主要内容,如果未能解决你的问题,请参考以下文章