繁体   English   中英

TextView 点击监听器未被调用

[英]TextView click listener not being called

我正在尝试使 android 应用程序上的 TextView 可点击,但未调用侦听器。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_oggi"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/fragment_oggi_title_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="20dp"
        android:paddingTop="20dp"
        android:text="Oggi"
        android:textStyle="bold"
        android:textSize="25sp" />

    <ListView
        android:id="@+id/listView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:divider="@drawable/list_divider"
        android:dividerHeight="21dp"
        android:paddingTop="80dp"
        android:paddingRight="5dp"
        android:clickable="false"/>

</RelativeLayout>

那是片段,我正在尝试使“fragment_oggi_title_textview”可点击。

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)  {
    View view = inflater.inflate(R.layout.fragment_oggi, container, false);

    view.post(() -> {
        TextView textView = (TextView) MainActivity.getInstance().findViewById(R.id.fragment_oggi_title_textview);

        textView.setClickable(true);
        textView.setFocusable(true);

        formattedDate = format.format(calendar.getTime());
        textView.setText(String.format("Oggi (%s)", formattedDate));

        DatePickerDialog.OnDateSetListener dateListener = (view1, year, monthOfYear, dayOfMonth) -> {
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.MONTH, monthOfYear);
            calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);

            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.detach(this);
            fragmentTransaction.attach(this);
            fragmentTransaction.commit();
            System.out.println("CLICK1!");
        };

        textView.setOnClickListener((View.OnClickListener) v -> {
            new DatePickerDialog(MainActivity.getInstance(), dateListener, calendar
                    .get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                    calendar.get(Calendar.DAY_OF_MONTH)).show();
            System.out.println("CLICK!");
        });
    });

    return view;
}

那是我的片段 class。 我正在设置 TextView 可点击和聚焦。 可悲的是,当我从模拟器和实际电话中单击 TextView 时,不会调用侦听器。 唯一一次调用它是当我用键盘 select 它并用回车键按下它时。 有谁知道我可能做错了什么?

编辑:TextVuew 被列表视图覆盖,这就是我无法单击它的原因。

如果 TextView 在Activity中,您可以在 Activity 中创建一个 getter 来获取 TextView,如下所示:

    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
            /*
            rest of your code
             */
        textView = findViewById(R.id.textView);
    }

    public TextView getTextView() {
        return textView;
    }
}

在 onCreateView() 的 Fragment 中:

TextView textView = ((YourActivity)requireActivity()).getTextView();

如果您的 TextView 在片段中,请使用

TextView textView = (TextView) view.findViewById(R.id.fragment_oggi_title_textview);

更新

您的 TextView 没有收到点击事件的原因是因为它被您的布局中的 ListView 覆盖,您需要检查您的布局

保持简单并像这样:

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)  {
    View view = inflater.inflate(R.layout.fragment_oggi, container, false);

    TextView textView =findViewById(R.id.fragment_oggi_title_textview);

        formattedDate = format.format(calendar.getTime());
        textView.setText(String.format("Oggi (%s)", formattedDate));

        DatePickerDialog.OnDateSetListener dateListener = (view1, year, monthOfYear, dayOfMonth) -> {
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.MONTH, monthOfYear);
            calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);

            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.detach(this);
            fragmentTransaction.attach(this);
            fragmentTransaction.commit();
            System.out.println("CLICK1!");
        };

        textView.setOnClickListener( v -> {
            new DatePickerDialog(MainActivity.getInstance(), dateListener, calendar
                    .get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                    calendar.get(Calendar.DAY_OF_MONTH)).show();
            System.out.println("CLICK!");
        });

    return view;
}

首先是你不需要view.post()因为Fragment有它自己的方法OnViewCreated ,它在创建View后返回View 其次,您可以使用返回的view找到您的TextView 因此,像这样重新格式化fragment中的代码:

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)  {
        return inflater.inflate(R.layout.fragment_oggi, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);

            TextView textView = view.findViewById(R.id.fragment_oggi_title_textview);

            formattedDate = format.format(calendar.getTime());
            textView.setText(String.format("Oggi (%s)", formattedDate));

            DatePickerDialog.OnDateSetListener dateListener = (view1, year, monthOfYear, dayOfMonth) -> {
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.MONTH, monthOfYear);
            calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);

            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.detach(this);
            fragmentTransaction.attach(this);
            fragmentTransaction.commit();
            System.out.println("CLICK1!");
        };

        textView.setOnClickListener( v -> {
            new DatePickerDialog(MainActivity.getInstance(), dateListener, calendar
                    .get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                    calendar.get(Calendar.DAY_OF_MONTH)).show();
            System.out.println("CLICK!");
        });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM