J'ai un problème avec findViewByid
mais je ne trouve pas où est le problème.
Voici mon code de classe 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);
}
}
Vous devez le faire dans 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
ne fournit pas la méthode findViewById()
. Ceci est fourni dans Activity
ou View
. Lorsque vous implémentez une Fragment
, vous ne gonflez pas vos vues dans onCreate()
(comme vous le faites normalement dans Activity
.) À la place, vous le faites dans onCreateView()
et vous devez utiliser la racine View
gonflée pour trouver l'ID dans la présentation gonflée.
getActivity().findViewById()
fonctionne. Cependant, ce n'est pas une bonne pratique car le fragment peut être réutilisé dans une autre activité.
Pour ce faire, il est recommandé de définir une interface .
L'interface doit contenir des méthodes permettant au fragment de communiquer avec son activité parent.
public interface MyInterfcae {
void showTextView();
}
Ensuite, votre activité implémente cette interface.
public class MyActivity extends Activity implements MyInterfcae {
@Override
public void showTextView(){
findViewById(R.id.textview).setVisibility(View.VISIBLE);
}
}
Dans ce fragment, saisissez une référence à l'interface.
MyInterface mif = (MyInterface) getActivity();
Appelez une méthode.
mif.showTextView();
De cette façon, le fragment et l'activité sont complètement découplés et chaque activité mettant en œuvre ce fragment est capable d'attacher ce fragment à lui-même.
J'ai eu ce problème lorsque j'ai téléchargé un exemple de projet à partir de github. Ce projet avait
compileSdkVersion 23
buildToolsVersion "23.0.0"
targetSdkVersion 23
dans l'activité context
et findViewById()
étaient en rouge dans la méthode onCreate (). J'ai donc mis à jour les versions ci-dessus pour
compileSdkVersion 25
buildToolsVersion "25.0.3"
targetSdkVersion 25
et l'erreur a été résolue.
Je rencontre la même question dans l'apprentissage en studio Android, simplement parce que je crée le projet par Fragment
. Choisissez Blank Activity
sans Fragment
le résoudre.
J'ai trouvé une solution en changeant targetSdkVersion de 23 à 21