【发布时间】:2015-07-20 19:47:00
【问题描述】:
我已经阅读了几篇与我有相同问题的 SO 帖子:
- 当我在 Fragment 类中为视图(在本例中为 EditText)添加 OnClickListener 时,不会触发 click 事件。
- 如果我将代码从 Fragment 类移开并移到 Activity 中,则会正确触发 click 事件。
其他 SO 问题提出了相同的问题,但据我所知,他们拥有的解决方案(如果有)不适用于我的情况。因此,我“再次”问这个问题。
一、fragment_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="se.snapcode.lanstrafiken.MainActivityFragment">
<LinearLayout
android:focusable="true" android:focusableInTouchMode="true"
android:layout_width="0px" android:layout_height="0px"/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textPostalAddress"
android:ems="15"
android:id="@+id/editTextFrom"
android:hint="From"
android:layout_alignParentEnd="true"
android:focusableInTouchMode="false"
android:clickable="true"
android:layout_marginBottom="20sp"
/>
</LinearLayout>
现在是 MainActivityFragment.java:
public class MainActivityFragment extends Fragment {
public MainActivityFragment() { }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View myView = inflater.inflate(R.layout.fragment_main, container, false);
EditText ed1 = (EditText) myView.findViewById(R.id.editTextFrom);
ed1.setText("This is a test");
ed1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Snapcode", "Test 1 2 3");
Toast.makeText(v.getContext(), "test", Toast.LENGTH_LONG).show();
}
});
EditText ed2 = (EditText) myView.findViewById(R.id.editTextTo);
ed1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
return myView;
}
}
当我单击 EditText 时,Log.d(...) 根本不显示在 logcat 中,并且 Toast 也不显示。
现在,如果我从 Fragment 中删除与 EditText 相关的所有内容,并将其放置在 Activity 中,它会起作用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar1);
setSupportActionBar(toolbar);
EditText ed1 = (EditText) findViewById(R.id.editTextFrom);
ed1.setText("Test again");
ed1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Snapcode", "Test from Activity");
Toast.makeText(MainActivity.this, "test", Toast.LENGTH_LONG).show();
}
});
}
// ...
}
有什么想法吗?
旁注
我认为 Android 代码不是“封装”的设计真的很糟糕。如上所示,我可以从 Fragment 外部访问 Fragment 内部的控件,就好像这些控件都在同一个范围内一样。 R.id.editTextFrom 随处可见,我觉得这很令人不安。它应该只在 Fragment 中可用,除非您明确将其设为“公共”。与 .NET 中的 UserControls 相比 - UserControls 是真正独立的。
我还没有尝试过,但是如果两个单独的片段具有相同的控件 ID 会发生什么?闻起来像网络当前的工作方式(以及 WebComponents 试图解决的问题)。
【问题讨论】:
-
onClick 在 EditText 或 TextView 中不可用。你想用 onClick 做什么?如果有必要,您将使用 onTouch。
-
@Ted 我无法重现该问题,使用您的 Fragment 代码和 Fragment 布局 xml 中的 EditText,我得到了 Toast。
-
如果我将代码放在 onActivitycreated 方法中,它对我有用
-
@MetehanToksoy 不可用?好吧,实际上,如果我将代码放在 Activity 而不是 Fragment =)
-
@DanielNugent 这很奇怪。您使用的代码与我上面的代码基本相同?你得到吐司吧?很奇怪。我在装有 Android 5.1 的设备上运行它。你?
标签: android android-fragments android-event