在android上,当我动态设置TextView的文本时,它不会';不变
我是android平台的新手,所以我知道我只是错过了一些东西在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_
<!-- 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;
}
}