2016-04-01 29 views
0

Bir Dialer uygulaması yapıyorum ve bu kılavuzu takip ediyorum Simple Dialer Application Tek fark, Activity yaklaşımından ziyade Fragments (destek kitaplığında) kullanıyorum. Uygulamayı çalıştırmayı denediğimde, iyi derler ancak düz beyaz bir ekran görüntüler. Parçalar doğru şekilde uygulanmadı mı yoksa bir şekilde sonsuz bir döngüye giriyor muyum? Lütfen herhangi bir yardım için teşekkür ederiz. Teşekkür peşin!Düz Ekran çalışırken Uygula

package com.heroicjokester.android.haid; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 


public class DialerActivity extends FragmentActivity { 

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

    FragmentManager fm = getSupportFragmentManager(); 
    Fragment fragment = new DialerFragment(); 

     if(fragment == null){ 
      fragment = new DialerFragment(); 
      fm.beginTransaction() 
        .add(R.id.fragment_container,fragment) 
        .commit(); 
     } 
} 
} 

Benim activity_dialer.xml:

<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/fragment_container" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
> 

</FrameLayout> 

Fragment_dialer.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/app_name" 
    android:gravity="center" 
    android:textAppearance="?android:attr/textAppearanceLarge"/> 

<EditText 
    android:id="@+id/input_pno" 
    android:inputType="number" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="@string/input_pno_hint" 
    /> 

<Button 
    android:id="@+id/dial_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/dial_button" 
    android:layout_gravity="center_horizontal"/> 



</LinearLayout> 

DialerFragment.java:

package com.heroicjokester.android.haid; 

import android.Manifest; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast;; 
import android.support.v4.content.ContextCompat; 

/** 
    * Created by Ripcord on 01-Apr-16. 
    */ 
public class DialerFragment extends Fragment { 
private EditText mPhoneField; 
private Button mDialButton; 

//Requesting Permissions using Runtime Permissions. 
final private int REQUEST_CODE_ASK_PERMISSIONS=0; 

private void InitiateCall(){ 
    int hasCallPermission =   ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_PHONE_STATE); 
    if (hasCallPermission != PackageManager.PERMISSION_GRANTED){ 
     requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 
       REQUEST_CODE_ASK_PERMISSIONS); 
     return; 
    } 
    InitiateCall(); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){ 
    switch (requestCode){ 
     case REQUEST_CODE_ASK_PERMISSIONS: 
      if (grantResults[0]==PackageManager.PERMISSION_GRANTED){ 
       //YAY! PERMISSION GRANTED 
       InitiateCall(); 
      }else{ 
       //GD! PERMISSION DENIED 
       Toast.makeText(getActivity(), R.string.permission_denied, Toast.LENGTH_SHORT).show(); 
      } 
      break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

    } 
} 



@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

@Override 
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ 
    View v=inflater.inflate(R.layout.fragment_dialer,container,false); 

    mPhoneField=(EditText) v.findViewById(R.id.input_pno); 
    mDialButton=(Button) v.findViewById(R.id.dial_button); 

    mDialButton.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v){ 
      try{ 
       if (mPhoneField != null && (mPhoneField.getText().length()==10||mPhoneField.getText().length()==11)){ 
        startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + mPhoneField.getText()))); 
       } 
       else if(mPhoneField != null && mPhoneField.getText().length()==0){ 
        Toast.makeText(getActivity(),R.string.no_number_toast,Toast.LENGTH_SHORT).show(); 
       } 
       else if(mPhoneField !=null && mPhoneField.getText().length()<10){ 
        Toast.makeText(getActivity(),R.string.wrong_number_toast,Toast.LENGTH_SHORT).show(); 
       } 
      } catch (Exception e){ 
       Log.e("DialerAppActivity","error: " + e.getMessage(),e);//Runtime error will be logged 
      } 
     } 
    }); 


    return v; 
} 

} 
Burada

benim MainActivity.java var

Son olarak benim günlük dosyası:

04-01 16:55:56.067 2372-2372/? I/art: Not late-enabling -Xcheck:jni (already on) 
04-01 16:55:56.143 2372-2372/com.heroicjokester.android.haid W/System: ClassLoader referenced unknown path: /data/app/com.heroicjokester.android.haid-1/lib/x86 
04-01 16:55:56.173 2372-2385/com.heroicjokester.android.haid D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 
04-01 16:55:56.279 2372-2385/com.heroicjokester.android.haid I/OpenGLRenderer: Initialized EGL, version 1.4 
04-01 16:55:56.564 2372-2385/com.heroicjokester.android.haid W/EGL_emulation: eglSurfaceAttrib not implemented 
04-01 16:55:56.564 2372-2385/com.heroicjokester.android.haid W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xabfebbe0, error=EGL_SUCCESS 
04-01 16:55:57.263 2372-2372/com.heroicjokester.android.haid I/Choreographer: Skipped 33 frames! The application may be doing too much work on its main thread. 
04-01 17:01:31.638 2372-2378/com.heroicjokester.android.haid W/art: Suspending all threads took: 9.827ms 
04-01 17:06:24.378 2372-2378/com.heroicjokester.android.haid W/art: Suspending all threads took: 15.026ms 

cevap

0

if(fragment == null) asla bu nedenle parça işlem denir alma asla, true döndürür.

private static final String FRAGMENT_TAG_DIALER = "fragment:dialer"; 

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

    FragmentManager fm = getSupportFragmentManager(); 
    Fragment fragment = (DialerFragment) fm.findFragmentByTag(FRAGMENT_TAG_DIALER); 

    if(fragment == null){ 
     fragment = new DialerFragment(); 
     fm.beginTransaction() 
       .add(R.id.fragment_container, fragment, FRAGMENT_TAG_DIALER) 
       .commit(); 
    } 
} 
+0

Teşekkür: Sana bu durumda ilk parçasını bulmaya çalışmalısınız, fragman yönü değiştirildikten sonra yerini almaz emin olmak için çalışıyor ve bu bulunmazsa, yenisini oluşturmak varsayalım çok! işe yaradı! Lütfen bu değişikliklerin ne anlama geldiğini açıklayabilir misiniz? Ve şimdi uygulama iyi çalışıyor ama çeviremiyorum, benim günlük – HeroicJokester

+0

@HeroicJokester çağrı hizmeti için izin reddi diyor Temel olarak "FragmentTransaction.add (int, parça, dize)" yöntemi parçasına bir "etiket" ekler . 'findFragmentByTag() işlevi, belirtilen * etiketine * sahip bir parça için düzeni (setContentView()' ile bir set) arar. Bu * etiketi * olan parça bulunamazsa, null değerini döndürür. Şimdi yeni bir tane oluşturmadan önce parçanın boş olup olmadığını kontrol edebilirsiniz. – Bryan

+0

@HeroicJokester İzin sorununuz için 'targetSdkVersion' nedir? 23 veya daha yüksek bir değere ayarlanırsa, yeni [izinler modelini] (http://developer.android.com/training/permissions/requesting.html) izlemeniz ve çalışma zamanında izinler almanız gerekir. – Bryan