15

フラグメントを使用して、最初の適切な Android アプリを構築しようとしています。私はメインのxmlを持っています。これは 2 つの垂直フラグメントで構成され、上部のフラグメントは 2 つの TextView のみで構成されます。最初のテキストには静的テキストが含まれ、2 番目のテキストには最終的に SQL から動的に取得する値が含まれます。

これを MainActivity.java にすると、最初の Fragment の 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 があるため、このフィールドの設定を、MainActivity 用の Java ではなく、フラグメントをサポートする Java に入れたいと考えています。

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

    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 行でエラーが発生します。

「FragmentMainTop 型のメソッド findViewById(int) は定義されていません」

では、なぜこの方法を知らないのでしょうか。私は ctl/shift/o を持っているので、すべての適切なインポートがあることを知っています。すべてのコードを MainActivity に入れたくありません。別のアクティビティで Fragment を使用したい場合は、すべてのコードを繰り返さなければならないからです。

4

3 に答える 3

47

メソッドにアクセスできるように、膨張したフラグメント レイアウトを変数に割り当てる必要があります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;
}

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

于 2013-03-10T12:32:59.223 に答える
2

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

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

于 2013-03-10T12:39:19.560 に答える
0

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

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


        }
    });
}
}

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

于 2014-06-12T06:14:01.937 に答える