Android : How do I update my textView in a Fragmen

2019-02-03 07:27发布

I am trying to use fragments to build my first proper Android App. I have a main xml. which consists of two vertical fragments, the top fragments consists of just two TextViews. The first of these contains static text and the second contains a value which I will eventually be getting dynamically from SQL.

If i put this is my MainActivity.java then it happily updates the value of the TextView in my first Fragment:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    // Set the Text to try this out
    TextView t = (TextView)findViewById(R.id.viewItem);
    t.setText("Text to Display");
}

I have two fragment XMLs and a java to support each so I want to put the setting of this field into the Java that supports the fragment rather than the java that is for the MainActivity.

When I put it in the fragment it looks like this:-

    public class FragmentMainTop extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState){
    // -- inflate the layout for this fragment
    return inflater.inflate(R.layout.fragmentmt, container,false);

    // Set the Text to try this out
    TextView t = (TextView)findViewById(R.id.viewItem);
    t.setText("Text to Display");
}

But if I do this I get an error on the TextView line:

"The method findViewById(int) is undefined for the type FragmentMainTop"

So why does it not know this method? I have ctl/shift/o so I know I have all the right imports. I don't want to end up putting all my code in the MainActivity because if I want to then use the Fragment in another activity I will have to repeat all the code.

3条回答
孤傲高冷的网名
2楼-- · 2019-02-03 07:55

I am using this code from my activity to update a textview added in xml tag. The textview are class level objects. Heres some code:

<fragment
    android:id="@+id/fragmentRegister"
    android:name="com.proshore.loveis.RegisterFragment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/view1" />

Heres the fragment code just showing the class level variable.

public class RegisterFragment extends Fragment implements OnClickListener {

TextView textViewDOB, textViewLanguage;

public RegisterFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
//eluded methods here
}
}

Now the activity from where I update my fragment:

public class RegisterActivity extends FragmentActivity {
Button buttonEnter;
RegisterFragment fragmentRegister;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);
    buttonEnter = (Button) findViewById(R.id.buttonEnter);
    fragmentRegister = (RegisterFragment) getSupportFragmentManager()
            .findFragmentById(R.id.fragmentRegister);
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    buttonEnter.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.d("dontknowitwillowrk", fragmentRegister.textViewLanguage
                    .getText().toString());
            fragmentRegister.textViewLanguage.setText("hello mister how do you do");


        }
    });
}
}

Note: not sure if this is a good way.

查看更多
▲ chillily
3楼-- · 2019-02-03 07:56

You need to assign the inflated fragment layout to a variable so that you can access its findViewById() method. Then you return it once you're done updating your widgets.

@Override
public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState){
    // -- inflate the layout for this fragment
    View myInflatedView = inflater.inflate(R.layout.fragmentmt, container,false);

    // Set the Text to try this out
    TextView t = (TextView) myInflatedView.findViewById(R.id.viewItem);
    t.setText("Text to Display");

    return myInflatedView;
}

Normally, when you call findViewById() within an Activity, you're invoking Activity.findViewById(). Trying the same call within your Fragment class will fail because there is no such Fragment.findViewById() method. So, you must use View.findViewById() with your inflated view to obtain references to your widgets.

查看更多
Summer. ? 凉城
4楼-- · 2019-02-03 08:13

I am not an expert but I would say that return statement within a method returns something and the next lines after this statement are unreachable :O

So try to change the order! :)

查看更多
登录 后发表回答