В общем ,решил внедрить в приложение google карты через фрагменты,в конченом итоге получил 2 ошибки:"Cannot resolve method 'setContentView' Cannot resolve method 'getSupportFragmentManager'",не могли бы вы подсказать примерные варианты их исправления?
MainActivity
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.widget.TextView;
import com.google.android.gms.maps.SupportMapFragment;
public class MainActivity extends AppCompatActivity {
FragmentManager fm = getSupportFragmentManager();
private TextView mTextMessage;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_news:
setTitle("Новости");
NewsListFragment fragment = new NewsListFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fram, fragment, "FragmentName");
fragmentTransaction.commit();
return true;
case R.id.navigation_museums:
setTitle("Музеи");
MuseumsListFragment fragment1 = new MuseumsListFragment();
FragmentTransaction fragmentTransaction1 = getSupportFragmentManager().beginTransaction();
fragmentTransaction1.replace(R.id.fram, fragment1, "FragmentName");
fragmentTransaction1.commit();
return true;
case R.id.navigation_map:
setTitle("Карта");
MapFragment fragment2 = new MapFragment();
FragmentTransaction fragmentTransaction2 = getSupportFragmentManager().beginTransaction();
fragmentTransaction2.replace(R.id.fram, fragment2, "FragmentName");
fragmentTransaction2.commit();
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextMessage = (TextView) findViewById(R.id.message);
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
setTitle("Новости");
NewsListFragment fragment = new NewsListFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fram, fragment, "FragmentName");
fragmentTransaction.commit();
}
}
MapFragment
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
/**
* A simple {@link Fragment} subclass.
*/
public class MapFragment extends Fragment implements OnMapReadyCallback {
private GoogleMap mMap;
public MapFragment() {
// Required empty public constructor
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setContentView(R.layout.fragment_map);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
//getView();
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_map, container, false);
}
/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines, add listeners or move the camera. In this case,
* we just add a marker near Sydney, Australia.
* If Google Play services is not installed on the device, the user will be prompted to install
* it inside the SupportMapFragment. This method will only be triggered once the user has
* installed Google Play services and returned to the app.
*/
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Создание маркера и определение на карте
LatLng Ural= new LatLng(56.841039, 60.622288);
mMap.addMarker(new MarkerOptions().position(Ural).title("---- \n"));
LatLng ekaterinburg= new LatLng(56.837319, 60.605603);
mMap.addMarker(new MarkerOptions().position(ekaterinburg).title("--- \n"));
}
// ((ImageView) convertView.findViewById(R.id.map_view)).setImageResource(R.drawable.tutor_ekb);
// public View getView(int position, View convertView, ViewGroup parent) {
// ((ImageView) convertView.findViewById(R.id.map_view)).setImageResource(R.drawable.tutor_ekb);
// return convertView;
// }
}
класс Fragment
(и все его наследники) не имеют методов setContentView()
и getSupportFragmentManager()
- это методы класса Activity
(и его наследников).
Разметка в фрагмент добавляется через инфлейт и возврат View
в колбэке onCreateView()
:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_map, container, false);
}
то есть вызов метода setContentView()
у вас просто лишний.
Управление фрагментом в фрагменте не очень хорошая идея, но чисто технически получить это можно так:
SupportMapFragment mapFragment = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map);
На самом деле вам нужно видимо наследовать свой фрагмент от SupportMapFragment
и вызывать его методы напрямую:
public class MapFragment extends SupportMapFragment implements OnMapReadyCallback {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getMapAsync(this);
return inflater.inflate(R.layout.fragment_map, container, false);
}
}
хотя с картами я не работал.
К ответу pvlofff могу добавить, в разметке xml файла надо указывать следующие:
<fragment
android:id="@+id/map"
android:layout_width="wrap_content"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
в самом фрагменте инитите карту:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view= inflater.inflate(R.layout.fragment_main_branch, container, false);
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.main_branch_map);
mapFragment.getMapAsync(this);
return view;
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap; // вот тут можно начинать работать с картой (что бы отработал этот колбек фрагмент должен implements OnMapReadyCallback)
}
}
И не забудьте в манифесте указать ключ
<meta-data android:name="com.google.android.geo.API_KEY" android:value="xxxxxxxxxxxxxxxxxxxxxxxxx"/>
ДОКУМЕНТАЦИЯ
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Установил intellij idea 20172, но при создании проекта в поле "Project SDK" значится надпись "No SDK"
Есть база данных postgresql, есть java класс который показывает все данные, как сортировать как чтобы, раньше показанные данные повторно не показывались,...