在android上,当我动态设置TextView的Text时,它不会改变

时间:2015-01-22 22:41:33

标签: 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_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>

然后我创建了一个名为MainFragment.java的片段。

public class MainFragment extends Fragment {
    public TextView displayTextView;
    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);

        return rootView;
    }
}

我在活动中的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>

这是MainActivity.java中的click事件

public void doSomething(View v) {
    this.mainFragment.displayTextView.setText("Nothing to set for some reason!");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        // 
        this.mainFragment = (MainFragment) getSupportFragmentManager().findFragmentById(R.id.mainFragment);
        mainFragment = new MainFragment();

        getSupportFragmentManager().beginTransaction().add(mainFragment, "mainFragment").commit();

    }
}

2 个答案:

答案 0 :(得分:0)

如果使用“活动”,则可以通过XML声明onClick-Listeners。但是,根据Google API,如果您使用碎片,则需要以编程方式声明OnClickListeners。

  

[...]您还可以以编程方式而不是XML布局声明click事件处理程序。如果在运行时实例化Button或者需要在Fragment子类中声明单击行为,则可能需要这样做。

来源: http://developer.android.com/guide/topics/ui/controls/button.html

所以你可能想要使用它:

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;
    }
}

答案 1 :(得分:0)

问题在于您尝试执行按钮单击的方式。根据您的问题,我了解Button and TextView位于Fragment视图中。那么为什么试图在活动中访问它?这是错误的,那么没有必要使用Fragments。此外,这将导致许多严重问题。

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

更改片段代码:

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"