2016-08-16 9 views
1

Android 앱을 처음 사용합니다. Android 앱을 만들었으므로 앱을 재료 탭보기로 마이그레이션하려고 합니다만 어떻게해야하는지 이해할 수 없습니다. 이건 내 현재 코드입니다내 앱을 재료 탭보기에 통합 할 수 없습니다.

매니페스트 파일 :

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.package"> 

<uses-permission android:name="android.permission.SEND_SMS" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

<uses-feature 
    android:glEsVersion="0x00020000" 
    android:required="true" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/MyMaterialTheme"> 
    <activity android:name="com.package.MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <meta-data 
     android:name="com.google.android.geo.API_KEY" 
     android:value="xxxxxxxxxxxx" /> 
    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 

</application> 

</manifest> 

주요 활동

import android.os.Bundle; 
import android.support.design.widget.TabLayout; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 
    private Toolbar toolbar; 
    private TabLayout tabLayout; 
    private ViewPager viewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 
    } 


    private void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new Message(), "Message"); 
    adapter.addFragment(new Maps(), "Maps"); 
    viewPager.setAdapter(adapter); 
    } 

    class ViewPagerAdapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 

     public ViewPagerAdapter(FragmentManager manager) { 
      super(manager); 
     } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
     } 

     public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
     } 
    } 
    } 

Maps.java (탭 단편)

import android.Manifest; 
    import android.content.pm.PackageManager; 
    import android.support.v4.app.ActivityCompat; 
    import android.support.v4.app.Fragment; 
    import android.support.v7.app.AppCompatActivity; 
    import android.app.Activity; 
    import android.os.Bundle; 

    import com.google.android.gms.maps.CameraUpdateFactory; 
    import com.google.android.gms.maps.GoogleMap; 
    import com.google.android.gms.maps.MapFragment; 
    import com.google.android.gms.maps.OnMapReadyCallback; 
    import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
    import com.google.android.gms.maps.model.CameraPosition; 
    import com.google.android.gms.maps.model.LatLng; 
    import com.google.android.gms.maps.model.MarkerOptions; 

    public class Maps extends Fragment implements OnMapReadyCallback { 

    private int contentView; 

    @Override 
    public void onMapReady(GoogleMap map) { 
     map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 

     CameraPosition googlePlex = CameraPosition.builder() 
      .target(new LatLng(37.4219999, -122.0862462)) 
      .zoom(16) 
      .bearing(0) 
      .tilt(45) 
      .build(); 

     map.moveCamera(CameraUpdateFactory.newCameraPosition(googlePlex)); 
     map.addMarker(new MarkerOptions() 
      .position(new LatLng(17.440466, 78.496668)) 
      .title("SVIT") 
     .icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher))); 

     if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

     return; 
     } 
     map.setMyLocationEnabled(true); 


    } 

    private int checkSelfPermission(String accessFineLocation) { 
     return 0; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_maps); 
     MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
    } 

    public void setContentView(int contentView) { 
    this.contentView = contentView; 
    } 
} 

Message.java (두 번째 탭)

import android.app.Activity; 
    import android.content.Intent; 
    import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.telephony.SmsManager; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.Menu; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.Toast; 

    import com.package.R; 


    public class Message extends Fragment { 


    private int contentView; 

    public Message() { 

    } 

    Button sendBtn; 
    EditText txtphoneNo; 
    EditText txtMessage; 
    Button clearBtn; 
    Button mapBtn; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     sendBtn = (Button) findViewById(R.id.btnSendSMS); 
     txtphoneNo = (EditText) findViewById(R.id.editText); 
     txtMessage = (EditText) findViewById(R.id.editText2); 
     clearBtn = (Button) findViewById(R.id.btnClearSMS); 
     mapBtn = (Button) findViewById(R.id.btnMaps); 

     sendBtn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
      sendSMSMessage(); 
     } 
     }); 
     clearBtn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v2) { 

       txtMessage.setText(""); 
       txtphoneNo.setText(""); 


      } 
     }); 
     } 

    protected void sendSMSMessage() { 
     Log.i("Send SMS", ""); 
     String phoneNo = txtphoneNo.getText().toString(); 
     String message = txtMessage.getText().toString(); 

     try { 
      SmsManager smsManager = SmsManager.getDefault(); 
      smsManager.sendTextMessage(phoneNo, null, message, null, null); 
      Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show(); 
     } 

     catch (Exception e) { 
      Toast.makeText(getApplicationContext(), "SMS faild, please try again.", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
    } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_message, container, false); 
    } 

    public void setContentView(int contentView) { 
     this.contentView = contentView; 
    } 
    } 

Build.Gradle (응용 프로그램)

apply plugin: 'com.android.application' 

    android { 
    compileSdkVersion 23 
    buildToolsVersion '23.0.3' 

    defaultConfig { 
     applicationId "com.package" 
     minSdkVersion 16 
     targetSdkVersion 23 
     versionCode 1 
     versionName "3.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
testCompile 'junit:junit:4.12' 
//compile 'com.google.android.gms:play-services:9.2.1' 
//compile 'com.google.android.gms:play-services:8.3.0' 
compile 'com.android.support:appcompat-v7:22.2.1' 
compile 'com.google.android.gms:play-services-appindexing:9.2.1' 
compile 'com.google.android.gms:play-services-maps:9.4.0' 
compile 'com.google.android.gms:play-services-location:9.2.1' 
compile 'com.android.support:design:23.0.1' 
compile 'com.android.support:support-v4:22.2.1' 
} 

build.gradle (프로젝트)

// Top-level build file where you can add configuration options common to all sub-projects/modules. 

    buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.1.2' 

     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
    }  

    task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

나는 많은 온라인 자습서를 통해 따랐다과 재료 설계하지 않고 있지만, 재료 탭을 사용하려고 후 일 그것이 작동하지 않는 것을보십시오.

FragmentActivity과 동일하지, 난 @ cricket_007으로

Error:(42, 33) error: cannot find symbol method findViewById(int) 
Error:(69, 28) error: cannot find symbol method getApplicationContext() 
Error:(43, 29) error: cannot find symbol method findViewById(int) 
Error:(40, 28) error: cannot find symbol method findViewById(int) 
Error:(41, 33) error: cannot find symbol method findViewById(int) 
Error:(69, 20) error: onCreate(Bundle) in Maps cannot override onCreate(Bundle) in Fragment 
attempting to assign weaker access privileges; was public 
Error:(36, 20) error: onCreate(Bundle) in Message cannot override onCreate(Bundle) in Fragment 
attempting to assign weaker access privileges; was public 
Error:(72, 86) error: inconvertible types 
required: MapFragment 
found: Fragment 
Error:(81, 9) error: cannot find symbol method getMenuInflater() 
Error:(73, 28) error: cannot find symbol method getApplicationContext() 
Error:(78, 5) error: method does not override or implement a method from a supertype 
:app:compileDebugJavaWithJavac FAILED 
Error:Execution failed for task ':app:compileDebugJavaWithJavac'. 

> Compilation failed; see the compiler error output for details. 
+0

당신은 "자사가 작동하지"무엇을 의미 미상? 'TabLayout'은 무엇을하고 있습니까? 표시되지 않습니까? 접촉에 반응하지 않습니까? – Bryan

+0

먼저 탭보기를 만들었고 정상적으로 작동 중입니다. 그런 다음 해당 탭보기로 내 응용 프로그램에 연결하려고 시도한 다음 오류가 발생했습니다. 1) 오류 : (69, 20) 오류 : onCreate (번들)가 onCreate를 재정의 할 수 없습니다. 묶음) 조각에서 약한 액세스 권한을 할당하려고 시도합니다. 공개 2) 오류 : (72, 86) 오류 : 변환 할 수없는 유형 필수 : ​​MapFragment 발견 : 조각 – Srikar

+0

내가 뭔가를 잃어버린거야? 나는 당신이 말하는 오류를 보지 못합니다. – Bryan

답변

0

에 직면하고 오류가 지적입니다. 차이점을 이해하려면 development guide on fragments을 읽어 보시기 바랍니다.

오프 시작 지점으로,이 조각은 작동합니다 :

public class MessageFragment extends Fragment { 

    private static final String TAG = MessageFragment.class.getName(); 

    Button mSendButton; 
    Button mClearButton; 
    Button mMapButton; 

    EditText mMessageEditText; 
    EditText mPhoneNumberEditText; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_message, container, false); 

     mSendButton = (Button) view.findViewById(R.id.btnSendSMS); 
     mClearButton = (Button) view.findViewById(R.id.btnClearSMS); 
     mMapButton = (Button) view.findViewById(R.id.btnMaps); 

     mPhoneNumberEditText = (EditText) view.findViewById(R.id.editText); 
     mMessageEditText = (EditText) view.findViewById(R.id.editText2); 

     mSendButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       sendSMSMessage(); 
      } 
     }); 

     mClearButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mMessageEditText.setText(""); 
       mPhoneNumberEditText.setText(""); 
      } 
     }); 

     return view; 
    } 

    protected void sendSMSMessage() { 
     Log.i(TAG, "Send SMS"); 
     String phoneNo = mPhoneNumberEditText.getText().toString(); 
     String message = mMessageEditText.getText().toString(); 

     try { 
      SmsManager smsManager = SmsManager.getDefault(); 
      smsManager.sendTextMessage(phoneNo, null, message, null, null); 
      Toast.makeText(getContext(), "SMS sent.", Toast.LENGTH_LONG).show(); 
     } catch (IllegalArgumentException exception) { 
      Toast.makeText(getContext(), "SMS failed, please try again.", Toast.LENGTH_LONG).show(); 
      exception.printStackTrace(); 
     } 
    } 

} 
+0

이것은 메시지 감사를 위해 일했습니다 – Srikar

+0

내지도 양식을 사용하는 것을 멈추게하는 것이 유일한 방법입니다. – Srikar

+0

@Srikar API [데모 포함] (https : // github 'ViewPager'안에'MapFragment'를 배치하는 법에 대한 자세한 내용은 .com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/MapInPagerDemoActivity.java) 그 코드에. 특정 문제에 직면하고 다른 질문을 게시 한 후 여기에 링크하면 나는 살펴볼 것입니다. – Bryan

관련 문제