Содержимое активности во фрагмент

#android #android-fragments #android-activity #sms

#Android #android-фрагменты #android-активность #sms

Вопрос:

Я разрабатываю приложение для SMS, но я новичок в разработке приложений, поэтому у меня возникли проблемы, пожалуйста, помогите мне. Пока я могу получать сообщения, но проблема в том, что я могу показывать SMS только для действия, но вместо этого я хочу показывать их во фрагменте.

Ниже мой «FetchingInboxActivity.java »

   import android.Manifest;
  import android.app.Activity;
  import android.content.ContentResolver;
  import android.content.pm.PackageManager;
  import android.database.Cursor;
  import android.net.Uri;
  import android.os.Bundle;
  import android.util.Log;
  import android.widget.ArrayAdapter;
  import android.widget.ListView;
  import android.widget.Toast;
  import androidx.annotation.NonNull;
  import androidx.core.app.ActivityCompat;
  import androidx.core.content.ContextCompat;
  import androidx.fragment.app.FragmentManager;

  import java.util.ArrayList;

  public class FetchingInboxActivity extends Activity {
  ListView listView;
  private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;
  ArrayList<String> smsList;
  private static final String TAG = FetchingInboxActivity.class.getSimpleName();

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

    listView = (ListView) findViewById(R.id.abcd);

    int permissioncheck = ContextCompat.checkSelfPermission(this,    
  Manifest.permission.READ_SMS);

    if(permissioncheck == PackageManager.PERMISSION_GRANTED){
        showContacts();
    } else{
        ActivityCompat.requestPermissions(this, new String[]{ 
   Manifest.permission.READ_SMS}, PERMISSIONS_REQUEST_READ_CONTACTS);
    }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[]       
    permissions, 
   @NonNull int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
            showContacts();
        }

    } else{
        Toast.makeText(this, "Grant kro be", Toast.LENGTH_LONG).show();
    }
    }

    private void showContacts() {
    Uri inboxUri = Uri.parse("content://mms-sms/conversations/?simple=true");
    smsList = new ArrayList<>();
    ContentResolver contentResolver = getContentResolver();

    Cursor cursor = contentResolver.query(inboxUri, null, null, null, null);
    while (cursor.moveToNext()){
        String number = 
   cursor.getString(cursor.getColumnIndexOrThrow("address")).toString();
        String body = 
   cursor.getString(cursor.getColumnIndexOrThrow("body")).toString();
        smsList.add("Number: " number  "n"   "Body: " body);
        Log.d(TAG, "showcontacts: ");
    }
    cursor.close();
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
   android.R.layout.simple_list_item_1, smsList);
    listView.setAdapter(adapter);

    }
   }
 

Ниже приведен мой XML-файл «FetchingInboxActivity.java »

     <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FetchingInboxActivity"
    android:id="@ id/containr">

    <ListView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@ id/abcd" />

    </FrameLayout>
 

Ниже приведен мой класс фрагментов, в котором я хочу показать входящие вместо вышеупомянутой активности.

       public class AwayFragment extends Fragment {


    public AwayFragment() {
    // Required empty public constructor
    }

    static AwayFragment inst;
    ArrayList<String> smsMessageList = new ArrayList<String>();
    ListView smsListView;
    ArrayAdapter arrayAdapter;

    static AwayFragment instance() { return inst;}
    @Override
    public void onStart(){
    super.onStart();
    inst = this;
    }

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


    // Inflate the layout for this fragment
    String[] awayStrings = {
            "gas",
            "cook",
            "Sunset",
            "MidMorning",
            "Good Morning",
            "Breakfast",
            "MidMorning",
            "Lunch",
            "Afternoon",
            "Sunset",
            "Supper Time",
            "Lunch",
            "Afternoon",
            "Supper Time",
            "Lovely Night",
            "Chilly Dreams"
    };
    ListView lv = (ListView) view.findViewById(R.id.listView2);

    ArrayAdapter<String> lva = new ArrayAdapter<String>(
            getActivity(), android.R.layout.simple_list_item_1, awayStrings);
    lv.setAdapter(lva);

    final SwipeRefreshLayout mSwipeRefreshLayout = (SwipeRefreshLayout) 
    view.findViewById(R.id.fragment_away);
    mSwipeRefreshLayout.setOnRefreshListener(
            () -> {
                ((MainActivity) getActivity()).refreshNow();
                Toast.makeText(getContext(), "Refresh Layout working", 
    Toast.LENGTH_LONG).show();
            }
    );

    return view;
     }

    public static class Way extends AppCompatActivity{
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
     permissions, @NonNull int[] grantResults) {
        if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                showContacts();
            }

        } else{
            Toast.makeText(this, "Grant kro be", Toast.LENGTH_LONG).show();
        }
    }
    ListView listView;
    private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;
    ArrayList<String> smsList;
    private final String TAG = FetchingInboxActivity.class.getSimpleName();
    public void showContacts() {
    listView = (ListView) findViewById(R.id.listView2);
    final String[] projection = new String[]{"*"};
    Uri inboxUri = Uri.parse("content://mms-sms/conversations");
    smsList = new ArrayList<>();
    ContentResolver contentResolver = getContentResolver();

    Cursor cursor = contentResolver.query(inboxUri, projection, null, null, null);
    while (cursor.moveToNext()){
        String number = 
    cursor.getString(cursor.getColumnIndexOrThrow("address")).toString();
        String body = 
    cursor.getString(cursor.getColumnIndexOrThrow("body")).toString();
        smsList.add("Number: " number  "n"   "Body: " body);
        Log.d(TAG, "showcontacts: ");
    }
    cursor.close();
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_1, smsList);
    listView.setAdapter(adapter);

    }
    }}
 

Наконец, фрагмент XML-файла:

     <?xml version="1.0" encoding="utf-8"?>
    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/fragment_away"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@ id/listView2">
    </ListView>

    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 

Ответ №1:

Допустим, это макет вашей деятельности

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
        android:id="@ id/fragmentContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
 

А затем в вашей деятельности

 protected void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  this.setContentView(R.layout.activity_demo);
  this.loadFragment(SMSListFragment())
}

private final void loadFragment(Fragment fragment) {
       this.getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, fragment).commit();
}
 

Пожалуйста, ознакомьтесь с этим руководством по использованию фрагментов, затем вы можете переместить список и связанные с ним вещи во фрагмент.

Создание динамических пользовательских интерфейсов в Android с помощью фрагментов — Учебное пособие

Комментарии:

1. Я попробовал вышеупомянутый метод, но getSupportFragmentManager не работает!

2. @UtaibaNaqshbandi getFragmentManager() попробуйте с этим, возможно, вы используете библиотеку поддержки. Рассмотрите возможность использования новейшей библиотеки jetpack developer.android.com/jetpack/getting-started