在android上,当我动态设置TextView的文本时,它不会';不变

在android上,当我动态设置TextView的文本时,它不会';不变,android,android-fragments,Android,Android Fragments,我是android平台的新手,所以我知道我只是错过了一些东西 <!-- activity_main --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_

我是android平台的新手,所以我知道我只是错过了一些东西

<!-- activity_main -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.example_app.MainActivity"
    tools:ignore="MergeRootFrame" >

    <fragment
        android:id="@+id/mainFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.example.example_app.MainFragment"
     />

</FrameLayout>
我在活动中的OnCreate函数中添加了片段,它似乎添加了所有内容,但当我单击按钮时,什么都没有发生,我记录了函数以查看其被调用,但设置textview没有做任何事情。我做错了什么

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.example_app.MainActivity$PlaceholderFragment" >

    <Button 
        android:id="@+id/button10"
        android:textColor="#ffffff"
        android:textSize="34dp"
        android:text="10%"
        android:layout_below="@id/amountEditText"
        android:background="@drawable/pct_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="doSomething"
     />

    <TextView 
        android:text="Blah Blah Blah"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:id="@+id/displayTextView" 
    ></TextView>

</RelativeLayout>

如果使用活动,则可以通过XML声明onClick侦听器。然而,根据GoogleAPI,如果使用片段,则需要以编程方式声明OnClickListeners

[…]您还可以通过编程而不是在XML布局中声明单击事件处理程序。如果您在运行时实例化按钮,或者需要在片段子类中声明单击行为,那么这可能是必需的

资料来源:

因此,您可能希望改用此选项:

public class MainFragment extends Fragment {
public TextView displayTextView;
public Button yourButton;
public MainFragment() { }

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

    View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    this.displayTextView = (TextView)rootView.findViewById(R.id.displayTextView);
    yourButton = (Button)rootView.findViewById(R.id.button10);
    yourButton.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
              displayTextView.setText("Nothing to set for some reason!");
         }
    });

        return rootView;
    }
}

问题在于您尝试执行按钮单击的方式。从您的问题中,我了解到
按钮和文本视图
位于
片段
视图中。那么为什么要在活动中访问它呢??这是错误的,那么使用片段就没有意义了。这也将导致许多严重的问题以后

片段是可重用的组件,因此片段的所有功能都必须留在片段类中

更改片段代码:

public class MainFragment extends Fragment {
    public TextView displayTextView;
    public Button yourButton;
    public MainFragment() { }

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

        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        this.displayTextView = (TextView)rootView.findViewById(R.id.displayTextView);
        yourButton = (Button)rootView.findViewById(R.id.button10);
        //Setting click listener for button in fragment 
        yourButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
        displayTextView.setText("Nothing to set for some reason!");
         }
    });
        return rootView;
    }
}

并从XML中删除android:onClick=“doSomething”,这只是一种预感。。。但是您是否在该按钮上设置了onClick Listener?我在片段按钮中设置了onClick,您需要查看设置了mainFragment的MainActivity的更多内容。我刚刚更新了从main Activity添加oncreate函数的功能,所以即使事件正在触发?因为我可以在到达断点时设置断点,这真的很有趣。onClick确实会触发,您甚至可以将该事件一直路由到片段。即使使用断点,调试器也告诉我TextView的值已更改,但视图在此之后没有更新TextView。我怀疑您需要添加一个处理程序或AsyncTask来更新片段中的UI,这将使其更加麻烦。但是,我的解决方案很短,对我来说效果很好。但是如果我有许多按钮调用同一个函数,那么让它们指向XML中的某个函数似乎比一遍又一遍地创建View.OnClickListener()更容易呢?感谢您澄清了片段中的逻辑,而不是活动中的逻辑。我来自遵循MVC的iOS,android没有。@JasonFoster只声明一个OnClickListener,并将所有按钮设置为该OnClickListener,而不是重新创建View.OnClickListener?@JasonFoster如果有这么多按钮调用同一个函数,会出现什么问题??您可以创建一个函数,并通过多次单击按钮来调用它
public class MainFragment extends Fragment {
public TextView displayTextView;
public Button yourButton;
public MainFragment() { }

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

    View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    this.displayTextView = (TextView)rootView.findViewById(R.id.displayTextView);
    yourButton = (Button)rootView.findViewById(R.id.button10);
    yourButton.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
              displayTextView.setText("Nothing to set for some reason!");
         }
    });

        return rootView;
    }
}
public class MainFragment extends Fragment {
    public TextView displayTextView;
    public Button yourButton;
    public MainFragment() { }

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

        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        this.displayTextView = (TextView)rootView.findViewById(R.id.displayTextView);
        yourButton = (Button)rootView.findViewById(R.id.button10);
        //Setting click listener for button in fragment 
        yourButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
        displayTextView.setText("Nothing to set for some reason!");
         }
    });
        return rootView;
    }
}