【问题标题】:onClickListener does not work in fragmentonClickListener 在片段中不起作用
【发布时间】:2013-09-19 12:02:30
【问题描述】:

片段中的 onClicklistener 有一些问题。如果我点击按钮,什么都不会发生。我既没有收到来自 Logcat 中的 onClicklistener 的消息,也没有在屏幕上出现 Toast,但我在代码中找不到错误。有什么想法吗?

如果有任何帮助,我将不胜感激!非常感谢!对不起我的英语不好

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Button;
import android.widget.Toast;
import android.util.Log;

public class InputFragment extends Fragment
{   
EditText input_text;
String text;
Button translate_button;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{ 
    View InputFragmentView = inflater.inflate(R.layout.input_fgmt, container, false);

    input_text = (EditText) InputFragmentView.findViewById(R.id.input_field);

    translate_button = (Button) InputFragmentView.findViewById(R.id.translate);


    translate_button.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            Log.d("Test", "onClickListener ist gestartet");
            Toast.makeText(getActivity().getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
            saveInString();

        }
    });

    return inflater.inflate(R.layout.input_fgmt, container, false);
}

public void saveInString()
{
    if(text.equals(null))
    {
        Toast.makeText(getActivity().getApplicationContext(), "Das Feld ist leer!", Toast.LENGTH_SHORT).show();
    }
    else
    {
        Toast.makeText(getActivity().getApplicationContext(), "Speichern...", Toast.LENGTH_LONG).show();
        text = input_text.getText().toString();
        Toast.makeText(getActivity().getApplicationContext(), "Fertig", Toast.LENGTH_SHORT).show();
    }

}
}    

【问题讨论】:

  • 尝试返回 InputFragmentView 而不是 inflater.inflate(R.layout.input_fgmt, container, false);
  • Java 变量名称约定以小写开头,使用 inputFragmentView 而不是 'InputFragmentView'。

标签: android android-fragments onclicklistener


【解决方案1】:

我认为问题出在您的代码中

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{ 
.....
....
 //problem is here below line
 return inflater.inflate(R.layout.input_fgmt, container, false);
}

返回你已经膨胀的视图

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    { 
        View inputFragmentView = inflater.inflate(R.layout.input_fgmt, container, false);
    .....
    ....

     return inputFragmentView;
    }

【讨论】:

  • 谢谢,这就是问题所在!
  • 我和@reedts 有同样的问题,但它与我返回的内容无关(我正在返回已经膨胀的视图)。但除此之外都是一样的 - click 事件似乎永远不会被触发。
【解决方案2】:

改变

 return inflater.inflate(R.layout.input_fgmt, container, false);

 return InputFragmentView ;

也可以这样改变:

translate_button.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View view)
    {
        Log.d("Test", "onClickListener ist gestartet");
        Toast.makeText(getActivity().getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
        saveInString();

    }
});

并作为 import android.view.View 导入;

【讨论】:

  • 你的第二条语句没用,他已经 import View.OnClickListener;
【解决方案3】:

对您的代码进行此更改

  1. 关于类定义:

     public class InputFragment extends Fragment implements View.OnClickListener
    
  2. 关于调用 setOnClickListener:

        translate_button.setOnClickListener(new View.OnClickListener()
        {
              @Override
              public void onClick(View InputFragmentView)
              {
                      Log.d("Test", "onClickListener ist gestartet");
                      Toast.makeText(getActivity().getApplicationContext(), "Test", Toast.LENGTH_LONG).show();                                    
                      saveInString();
              }
         });
    

【讨论】:

  • 如果您直接在按钮上手动设置 OnClickListener,则无需将其实现到该类。
【解决方案4】:

创建所有视图的最佳方法是重新定义方法:

@Override
public void onActivityCreated(Bundle saved) {
    super.onActivityCreated(saved);
     input_text = (EditText) InputFragmentView.findViewById(R.id.input_field);

translate_button = (Button) InputFragmentView.findViewById(R.id.translate);


translate_button.setOnClickListener(new OnClickListener()
{
    @Override
    public void onClick(View view)
    {
        Log.d("Test", "onClickListener ist gestartet");
        Toast.makeText(getActivity().getApplicationContext(), "Test",        Toast.LENGTH_LONG).show();
        saveInString();

    }
});

因为这个方法是在所有视图创建后调用的。 您应该阅读 Fragment 的生命周期。

【讨论】:

    【解决方案5】:

    setOnItemClickListener 与我一起使用片段而不是 setOnClickListener

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 2020-04-03
      • 2017-06-15
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多