【问题标题】:EditText in fragment片段中的 EditText
【发布时间】:2017-03-14 16:02:10
【问题描述】:

我试图让片段中的按钮在单击时增加一个文本字段如果我不使用片段但我无法让它在片段中工作,我可以做到这一点没有问题。

我创建了一个非常基本的测试应用程序。

t1 应该将值设置为 numOfClicks 但在调试时 t1 值始终为空。

  private int numOfClicks;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{

    View v = inflater.inflate(R.layout.page1, container,false);

    Button button1 = (Button) v.findViewById(R.id.btn1);
    button1.setOnClickListener(this);

    Button button2 =(Button)v.findViewById(R.id.btn2);
    button2.setOnClickListener(this);


   // EditText t1 = (EditText)v.findViewById(R.id.numClicked);
   // t1.setOnClickListener(this);

    return v;
}

@Override
public void onClick(View v)
{
    switch (v.getId()) {
        case R.id.btn1:
            //button code here
           //toast statement works!
           //Toast.makeText(v.getContext(), "yeah", Toast.LENGTH_SHORT).show();

            EditText t1 = (EditText)v.findViewById(R.id.numClicked);
            numOfClicks++;
            t1.setText(Integer.toString(numOfClicks));


            break;
        case R.id.btn2:
            Toast.makeText((v.getContext()), "button 2 pressed", Toast.LENGTH_SHORT).show();
            break;
    }
}

【问题讨论】:

  • 只需从 onClick 中删除 v.findViewById(R.id.numClicked) 使其成为 onCreateView

标签: android android-fragments fragment


【解决方案1】:

全局声明 EditText:

EditText t1 ;

在 onCreateView() 中初始化:

t1 = (EditText)v.findViewById(R.id.numClicked);

在 onClick() 中设置文本:

t1.setText(Integer.toString(numOfClicks));

【讨论】:

  • 不客气。 :)
【解决方案2】:

您应该在名为 numClicked 的 page1.xml 中声明一个 editText。然后你可以试试这段代码:

{

private int numOfClicks;
private EditText t1;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.page1, container, false);

    Button button1 = (Button) v.findViewById(R.id.btn1);
    button1.setOnClickListener(this);

    Button button2 = (Button) v.findViewById(R.id.btn2);
    button2.setOnClickListener(this);


    t1 = (EditText) v.findViewById(R.id.numClicked);

    return v;
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btn1:
            //button code here
            //toast statement works!
            //Toast.makeText(v.getContext(), "yeah", Toast.LENGTH_SHORT).show();


            numOfClicks++;
            t1.setText(Integer.toString(numOfClicks));


            break;
        case R.id.btn2:
            Toast.makeText((v.getContext()), "button 2 pressed", Toast.LENGTH_SHORT).show();
            break;
    }
}

}

【讨论】:

    【解决方案3】:

    不这样做.. 为什么

    • 参数 View 是您的按钮的视图,该按钮已被 onClick(触摸屏幕)。这个视图里面没有其他组件,只有她自己。

    详细信息:EditText t1 = (EditText)v.findViewById(R.id.numClicked);

    @Override
        public void onClick(View v)
        {
            switch (v.getId()) {
                case R.id.btn1:
                    //button code here
                   //toast statement works!
                   //Toast.makeText(v.getContext(), "yeah", Toast.LENGTH_SHORT).show();
    
                    EditText t1 = (EditText)v.findViewById(R.id.numClicked);
                    numOfClicks++;
                    t1.setText(Integer.toString(numOfClicks));
    
    
                    break;
                case R.id.btn2:
                    Toast.makeText((v.getContext()), "button 2 pressed", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    

    做什么?

    • onViewCreated 事件中找到您的组件引用。但为什么? onViewCreated(View view, @Nullable Bundle savedInstanceState), view参数是referente "main" view,她拥有你这个布局的所有组件。

      @Override
      public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
          super.onViewCreated(view, savedInstanceState);
          t1 = (EditText)v.findViewById(R.id.numClicked);
      }
      
    • 别忘了:您需要创建一个类属性,键入名称为 t1 的 EditText 来运行此示例。

    【讨论】:

      【解决方案4】:

      你在onClick()中调用.findViewByID的视图v实际上是被点击的按钮(这也是一个视图)

      因此,要查找文本字段,您需要按活动查找视图。您应该可以通过调用 v.getParrent() 来获得,除非按钮位于与 EditText 不同的容器内

      【讨论】:

        【解决方案5】:

        你可以使用http://jakewharton.github.io/butterknife/ 然后您可以将其声明为: @BindView(R.id.numClicked) EditText text;

        还要声明int numOfClicks = 0;,所以它从一开始就有一个值。

        并且还像这样设置监听器:

        @OnClick(R.id.btn1)
        public void submit(View view) {
            numOfClicks++;
                text.setText(Integer.toString(numOfClicks));
        }
        

        然后在你的 OnCreate 你只有这个: ButterKnife.bind(this);

        这比普通的 findViewByID 好,因为视图是在编译时创建的,并在 onCreate 时自动注入到 Activity 中,比标准初始化更有效。同样像这样,视图被声明为全局的,因此您可以在 Activity 的任何地方使用它们

        【讨论】:

          【解决方案6】:

          您的 numOfClicks 在开始时没有价值,您只能声明未设置值。

          执行您的程序:

          1. numOfClicks = null:
          2. numOfClicks++ (null +1) = null

          所以答案是 numOfClicks =0 的设置值;

          【讨论】:

            猜你喜欢
            • 2019-03-09
            • 2021-12-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-10
            相关资源
            最近更新 更多