Cannot resolve method 'setContentView' Cannot resolve method 'getSupportFragmentManager'

352
28 апреля 2018, 19:32

В общем ,решил внедрить в приложение 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;
//    }


}
Answer 1

класс 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);
    }
}

хотя с картами я не работал.

Answer 2

К ответу 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"/>

ДОКУМЕНТАЦИЯ

READ ALSO
Считать строку, используя стримы

Считать строку, используя стримы

Есть такой файл с такими строками:

200
Отсутствует SDK для java и ошибка &ldquo;the select directory is not a valid home for JDK&rdquo;

Отсутствует SDK для java и ошибка “the select directory is not a valid home for JDK”

Установил intellij idea 20172, но при создании проекта в поле "Project SDK" значится надпись "No SDK"

204
Как сортировать полученные из postgesql данные

Как сортировать полученные из postgesql данные

Есть база данных postgresql, есть java класс который показывает все данные, как сортировать как чтобы, раньше показанные данные повторно не показывались,...

182