findViewByid
に問題がありますが、どこに問題があるのかわかりません。
これが私のFirstFragment
クラスコードです。
import Android.app.Fragment;
import Android.os.Bundle;
import Android.support.annotation.Nullable;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.webkit.WebSettings;
import Android.webkit.WebView;
import Android.widget.ArrayAdapter;
import Android.widget.ListView;
import Android.widget.ProgressBar;
import Java.util.ArrayList;
import Java.util.List;
public class FirstFragment extends Fragment {
public static final String TAG = "first";
private WebView mWebView;
ProgressBar progressBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mWebView = (WebView) findViewById(R.id.activity_main_webview);
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.loadUrl("http://www.google.com");
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.secondefragment, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
}
OnCreateViewでこれを行う必要があります。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.secondefragment, container, false);
mWebView = (WebView) view.findViewById(R.id.activity_main_webview);
progressBar = (ProgressBar) view.findViewById(R.id.progressBar1);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.loadUrl("http://www.google.com");
return view;
}
Fragment
はfindViewById()
メソッドを提供しません。これはActivity
またはView
で提供されます。 Fragment
を実装するとき、onCreate()
でビューを膨らませることはありません(通常Activity
で行うように)。代わりに、onCreateView()
で行います。そして、膨張したルートView
を使用して、膨張したレイアウト内のIDを見つける必要があります。
getActivity().findViewById()
は機能します。ただし、フラグメントは別のアクティビティで再利用になる可能性があるため、これは良い方法ではありません。
これに推奨される方法は、interfaceを定義することです。
インターフェイスには、フラグメントがその親アクティビティと通信するために必要なメソッドが含まれている必要があります。
public interface MyInterfcae {
void showTextView();
}
次に、アクティビティがそのインターフェイスを実装します。
public class MyActivity extends Activity implements MyInterfcae {
@Override
public void showTextView(){
findViewById(R.id.textview).setVisibility(View.VISIBLE);
}
}
そのフラグメントで、インターフェースへの参照を取得します。
MyInterface mif = (MyInterface) getActivity();
メソッドを呼び出します。
mif.showTextView();
このようにして、フラグメントとアクティビティは完全に分離され、そのフラグメントを実装するすべてのアクティビティは、そのフラグメントを自身にアタッチできます。
Githubからサンプルプロジェクトをダウンロードしたときに、この問題が発生しました。このプロジェクトには
_compileSdkVersion 23
buildToolsVersion "23.0.0"
targetSdkVersion 23
_
アクティビティのcontext
およびfindViewById()
は、onCreate()メソッド内で赤色でした。それで、上記のバージョンを
_compileSdkVersion 25
buildToolsVersion "25.0.3"
targetSdkVersion 25
_
エラーが解決されました。
プロジェクトをFragment
で作成したからといって、Androidスタジオ学習でも同じ質問に答えます。 Fragment
なしでBlank Activity
を選択すると解決します。
TargetSdkVersionを23から21に変更して解決策を見つけました