【问题标题】:Click event does not fire in Android Fragment点击事件不会在 Android 片段中触发
【发布时间】: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


【解决方案1】:

我发现了问题。一个非常简单的,完全是我的错:

所以,是的...我的错,这里没什么可看的,继续前进 =)

【讨论】:

    猜你喜欢
    • 2018-04-18
    • 2020-12-27
    • 2013-05-19
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多