web-dev-qa-db-ja.com

Android:フラグメントのtextViewを更新する方法

最初の適切なAndroid Appを作成するためにフラグメントを使用しようとしています。2つの垂直フラグメントで構成されるメインxmlがあり、上部のフラグメントは2つのTextViewのみで構成されています。これらの最初のコンテンツは静的テキストと2番目には、SQLから動的に取得する値が含まれています。

これを私のMainActivity.Javaにすると、最初のフラグメントのTextViewの値が楽しく更新されます。

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

2つのフラグメントXMLとJavaがあるので、このフィールドの設定をJavaで、フラグメントではなく= JavaこれはMainActivity用です。

それをフラグメントに入れると、次のようになります:-

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

しかし、これを行うと、TextView行でエラーが発生します。

「メソッドfindViewById(int)はタイプFragmentMainTopに対して未定義です」

では、なぜこの方法を知らないのでしょうか?私はctl/shift/oを持っているので、すべての正しいインポートがあることがわかります。最終的にMainActivityにすべてのコードを配置したくありません。別のアクティビティでFragmentを使用する場合は、すべてのコードを繰り返す必要があるためです。

14
RobT

findViewById()メソッドにアクセスできるように、インフレートされたフラグメントレイアウトを変数に割り当てる必要があります。ウィジェットの更新が完了したら、それを返します。

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

通常、Activity内でfindViewById()を呼び出すと、Activity.findViewById()が呼び出されます。そのようなFragment.findViewById()メソッドがないため、Fragmentクラス内で同じ呼び出しを試行すると失敗します。したがって、ウィジェットへの参照を取得するには、インフレートされたビューでView.findViewById()を使用する必要があります。

47
Tyler MacDonell

私はエキスパートではありませんが、メソッド内のreturnステートメントは何かを返し、このステートメントの後の次の行に到達できないと言います:O

順番を変えてみてください! :)

2
Husky

私のアクティビティのこのコードを使用して、xmlタグに追加されたテキストビューを更新しています。 textviewはクラスレベルのオブジェクトです。ここにいくつかのコードがあります:

<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" />

これは、クラスレベルの変数を示すフラグメントコードです。

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

次に、フラグメントを更新する場所からのアクティビティ:

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");


        }
    });
}
}

注:これが良い方法かどうかはわかりません。

0