Android片段:片段

时间:2015-07-20 19:47:00

标签: android android-fragments android-event

我已经阅读了几篇与我有同样问题的SO帖子:

  • 当我在Fragment类中为View添加一个OnClickListener(在本例中为EditText)时,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随处可用,我觉得很令人不安。它应该仅在片段内可用,除非您明确地将其设为“公共”。与.NET中的UserControls相比 - UserControls是真正独立的。 我没试过,但是如果两个单独的片段具有相同的控件ID,会发生什么?闻到网络当前的运作方式(以及WebComponents试图解决的问题)。

1 个答案:

答案 0 :(得分:0)

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

enter image description here

所以,是的......我的坏,没有什么可看的,向右移动=)